Compressible Neo Hooke model

Theory

Hyperelastic materials are a class of constitutive models used to describe the elastic behavior of solids. They postulate a strain-energy density function \(\Psi\) from which stresses are obtained by differentiation with respect to appropriate strain measures. In finite strains we take \(\Psi=\Psi(\boldsymbol C)\), where the deformation gradient is \(\boldsymbol F\), the right Cauchy–Green tensor is \(\boldsymbol C=\boldsymbol F^{\mathsf T}\boldsymbol F\), and the Jacobian is \(J=\det\boldsymbol F\). The first invariant is \(I_1=\operatorname{tr}\boldsymbol C\).

The model implemented here is a compressible Neo-Hookean material with the Pence–Gou potential (variant B). An isochoric–volumetric split is defined by

\[\Psi(\boldsymbol C) = \Psi_{\rm d}(I_1,J) + \Psi_{\rm h}(J) = \frac{G}{2}\,\big(I_1\,J^{-2/3}-3\big) + \frac{K}{8}\,\big(J - J^{-1}\big)^2,\]

where \(G\) is the shear modulus and \(K\) is the bulk modulus.

The second Piola-Kirchhoff stress tensor follows from the potential as

\[\boldsymbol S = 2\,\frac{\partial \Psi}{\partial \boldsymbol C}.\]

The Kirchhoff and Cauchy stress tensors are obtained by push-forward operations:

\[\boldsymbol{\tau} = \boldsymbol F\,\boldsymbol S\,\boldsymbol F^{\mathsf T},\]
\[\boldsymbol{\sigma} = J^{-1}\,\boldsymbol{\tau}.\]

Using the chain rule, the first derivative of \(\Psi\) with respect to \(\boldsymbol C\) is

\[\frac{\partial \Psi}{\partial \boldsymbol C} = \frac{\partial \Psi}{\partial J}\,\frac{\partial J}{\partial \boldsymbol C} + \frac{\partial \Psi}{\partial I_1}\,\frac{\partial I_1}{\partial \boldsymbol C} = \Big[ \frac{K}{4}\,(J - J^{-1})\!\left(1+\frac{1}{J^{2}}\right) - \frac{G}{3}\,I_1\,J^{-5/3} \Big]\, \frac{J}{2}\,\boldsymbol C^{-{\mathsf T}} + \frac{G}{2}\,J^{-2/3}\,\boldsymbol I.\]

The resulting second Piola–Kirchhoff stress used in the implementation is

\[\boldsymbol S = G\,J^{-2/3}\Big(\boldsymbol I - \tfrac{1}{3}\,I_1\,\boldsymbol C^{-1}\Big) + \frac{K}{4}\,\big(J^{2}-J^{-2}\big)\,\boldsymbol C^{-1},\]

where \(I_1 = \operatorname{tr}\boldsymbol C\).

The resulting Kirchhoff stress, after the push-forward operation \(\boldsymbol{\tau} = \boldsymbol F\,\boldsymbol S\,\boldsymbol F^{\mathsf T}\), is:

\[\boldsymbol{\tau} = G\,J^{-2/3}\Big(\boldsymbol{b} - \tfrac{1}{3}\,\operatorname{tr}(\boldsymbol{b})\,\boldsymbol{I}\Big) + \frac{K}{4}\,\big(J^{2}-J^{-2}\big)\,\boldsymbol{I},\]

where \(\boldsymbol{b} = \boldsymbol F\,\boldsymbol F^{\mathsf T}\) is the left Cauchy-Green tensor.

The consistent tangent with respect to the deformation gradient \(\frac{\partial\boldsymbol{\tau}(\boldsymbol{S}(\boldsymbol{C}(\boldsymbol{F})), \boldsymbol{F})}{\partial\boldsymbol{F}}\) is computed via the chain rule as:

\[\frac{\partial\boldsymbol{\tau}}{\partial\boldsymbol{F}} = 2\,\frac{\partial\boldsymbol{\tau}}{\partial\boldsymbol{S}} : \frac{\partial^{2}\Psi}{\partial\boldsymbol{C}\,\partial\boldsymbol{C}} : \frac{\partial\boldsymbol{C}}{\partial\boldsymbol{F}} + \frac{\partial}{\partial\boldsymbol{F}}\left(\boldsymbol{F}\,\boldsymbol{S}\,\boldsymbol{F}^{\mathsf{T}}\right).\]

The individual derivatives are:

\[\frac{\partial\boldsymbol{\tau}}{\partial\boldsymbol{S}} = \boldsymbol{F}\otimes\boldsymbol{F},\]
\[\frac{\partial^{2}\Psi}{\partial \boldsymbol C\,\partial \boldsymbol C} = \frac{\partial^{2}\Psi}{\partial J^{2}}\, \frac{\partial J}{\partial \boldsymbol C}\otimes\frac{\partial J}{\partial \boldsymbol C} + \frac{\partial \Psi}{\partial J}\, \frac{\partial^{2} J}{\partial \boldsymbol C\,\partial \boldsymbol C} + \frac{\partial^{2}\Psi}{\partial J\,\partial I_1} \left( \frac{\partial J}{\partial \boldsymbol C}\otimes\frac{\partial I_1}{\partial \boldsymbol C} + \frac{\partial I_1}{\partial \boldsymbol C}\otimes\frac{\partial J}{\partial \boldsymbol C} \right),\]
\[\frac{\partial\boldsymbol{C}}{\partial\boldsymbol{F}} = \boldsymbol{F}^{\mathsf{T}}\otimes\boldsymbol{I} + \boldsymbol{I}\otimes\boldsymbol{F}^{\mathsf{T}},\]
\[\frac{\partial}{\partial\boldsymbol{F}}\left(\boldsymbol{F}\,\boldsymbol{S}\,\boldsymbol{F}^{\mathsf{T}}\right) = \boldsymbol{I}\otimes(\boldsymbol{S}\boldsymbol{F})^{\mathsf{T}} + \boldsymbol{S}\boldsymbol{F}\otimes\boldsymbol{I}.\]

For infinitesimal strains, this model reduces to linear isotropic elasticity.

Implementation

class CompressibleNeoHooke : public MarmotMaterialFiniteStrain

Inheritance diagram for Marmot::Materials::CompressibleNeoHooke:

digraph {
    graph [bgcolor="#00000000"]
    node [shape=rectangle style=filled fillcolor="#FFFFFF" font=Helvetica padding=2]
    edge [color="#1414CE"]
    "1" [label="Marmot::Materials::CompressibleNeoHooke" tooltip="Marmot::Materials::CompressibleNeoHooke" fillcolor="#BFBFBF"]
    "3" [label="MarmotMaterial" tooltip="MarmotMaterial"]
    "2" [label="MarmotMaterialFiniteStrain" tooltip="MarmotMaterialFiniteStrain"]
    "1" -> "2" [dir=forward tooltip="public-inheritance"]
    "2" -> "3" [dir=forward tooltip="public-inheritance"]
}

Collaboration diagram for Marmot::Materials::CompressibleNeoHooke:

digraph {
    graph [bgcolor="#00000000"]
    node [shape=rectangle style=filled fillcolor="#FFFFFF" font=Helvetica padding=2]
    edge [color="#1414CE"]
    "1" [label="Marmot::Materials::CompressibleNeoHooke" tooltip="Marmot::Materials::CompressibleNeoHooke" fillcolor="#BFBFBF"]
    "3" [label="MarmotMaterial" tooltip="MarmotMaterial"]
    "2" [label="MarmotMaterialFiniteStrain" tooltip="MarmotMaterialFiniteStrain"]
    "1" -> "2" [dir=forward tooltip="public-inheritance"]
    "2" -> "3" [dir=forward tooltip="public-inheritance"]
}

Compressible Neo-Hookean hyperelastic material model (Pence–Gou potential, variant B).

Material parameters

  • K - bulk modulus

  • G - shear modulus

State variables

  • No state variables required.

Public Functions

CompressibleNeoHooke(const double *materialProperties, int nMaterialProperties, int materialLabel)

Construct a CompressibleNeoHooke material.

Parameters:
  • materialProperties – Expects K at index 0 and G at index 1.

  • nMaterialProperties – Length of materialProperties.

  • materialLabel – Material label.

virtual void computeStress(ConstitutiveResponse<3>&, AlgorithmicModuli<3>&, const Deformation<3>&, const TimeIncrement&)

Compute the Kirchhoff stress and the algorithmic tangent for the current step.

Template parameter <3> indicates 3D.

Parameters:
  • response[inout]

    • tau - Kirchhoff stress tensor \(\boldsymbol{\tau}\).

    • elasticEnergyDensity - elastic energy density \(\psi\).

    • rho - density (unused here).

  • tangents[inout]

    • dTau_dF - algorithmic tangent \(\partial\boldsymbol{\tau}/\partial\boldsymbol{F}\).

  • deformation[in]

    • F - deformation gradient \(\boldsymbol{F}\).

  • timeIncrement[in]

    • t - old (pseudo-)time.

    • dT - (pseudo-)time increment.

inline virtual int getNumberOfRequiredStateVars()

Number of required state variables.

Returns:

Always 0 for this model.

inline virtual void assignStateVars(double *stateVars, int nStateVars)

Bind external state storage (unused for this model; required for the interface).

Parameters:
  • stateVars – Pointer to a contiguous array provided by the caller for internal state.

  • nStateVars – Number of entries in that array.

virtual StateView getStateView(const std::string &result)

Access a named state quantity (no states here).

Parameters:

result – Name of the state to view.

Returns:

Always an empty StateView since no states are used.

Public Static Attributes

static int nStateVarsRequired = 0

Number of required state variables (none here).