Hyperelasticity in a UMAT
The equations are the easy part. What goes wrong is which stress you return, which tangent Abaqus expects, and the fact that neither is the one your derivation produced.
What ddsdde does for this model today: the Jacobian check and the verification harness work on any material point you can express, and the diagnosis reads the job. Code generation currently emits J2 plasticity only. Abaqus also has good built-in hyperelastic models — write a UMAT when yours is not among them, not by default.
A hyperelastic model derives stress from a stored energy function. The derivation gives you the second Piola-Kirchhoff stress and a material tangent. Abaqus wants the Cauchy stress and something else, and the conversion is where implementations go wrong.
Which stress, and which tangent
Your energy function W(C) gives the second Piola-Kirchhoff stress S = 2 dW/dC naturally. That is not what the subroutine returns.
| Quantity | What your derivation gives | What Abaqus wants |
|---|---|---|
| Stress | S, second Piola-Kirchhoff, in the reference configuration | Cauchy stress, in the current configuration: sigma = J^-1 F S F^T |
| Tangent | dS/dE, the material tangent | The tangent associated with the Jaumann rate of Kirchhoff stress, divided by J |
The stress conversion is a push-forward and is hard to get wrong once you know it is needed. The tangent conversion is neither, and it is where most of the difficulty in this class of model lives.
The tangent conversion
Pushing the material tangent forward gives the spatial tangent. That is still not the one Abaqus wants: the solver works with an objective rate, and the tangent associated with the Jaumann rate carries additional terms involving the stress itself.
c_spatial_ijkl = J^-1 F_iI F_jJ F_kK F_lL C_IJKL
DDSDDE = c_spatial + stress-dependent terms from the objective rateThe volumetric-deviatoric split, and near-incompressibility
Rubber-like materials are nearly incompressible, and a displacement formulation locks. The standard treatment splits the energy:
W = W_dev(C_bar) + W_vol(J) with C_bar = J^(-2/3) CTwo practical consequences. The split makes the algebra considerably longer. It also introduces a bulk modulus that is a numerical parameter as much as a physical one. Too small and the material is compressible; too large and the system is ill-conditioned. And the element formulation has to match: hybrid elements exist for exactly this, and a nearly-incompressible material in an ordinary displacement element will lock however good the subroutine is.
What to check
- Zero deformation gives zero stress. With
F = Ithe stress must be exactly zero. A model that returns a residual stress at the undeformed state has a term that should have cancelled, and every result afterwards is offset. - Superposed rigid rotation changes nothing. Rotate the deformation gradient and confirm the Cauchy stress rotates with it and nothing else changes. This is the objectivity check, and unlike in small strain it is your responsibility here.
- Uniaxial tension against the closed form. Most standard models have an analytical uniaxial response. Compare against it over a wide stretch range, not just near unity where everything agrees.
- Simple shear. The normal stresses that appear under simple shear are a real effect and a sharp test — a model that produces none has lost a term.
- The tangent against finite differences. At several deformation states, including one well away from the reference. A tangent that is right near
F = Iand wrong at a stretch of two is a common outcome of a missing objective-rate term. - Volumetric behaviour separately. Apply hydrostatic loading and confirm the pressure-volume response matches the volumetric part of your energy function.
Common questions
My hyperelastic UMAT is right at small stretch and wrong at large stretch.
Usually a tangent that is missing the stress-dependent terms from the objective rate. Near the reference configuration the stress is small and those terms hardly matter; at large stretch they dominate.
A finite-difference check at a large deformation state finds this in one run.
Should I use UHYPER instead?
If your model is isotropic and can be written as an energy function of the strain invariants, yes. UHYPER takes the energy and its derivatives, and Abaqus does the stress and tangent conversions for you. That removes the whole class of error this page is about.
Use a UMAT when the model is anisotropic, has internal variables, or needs something the energy-function interface cannot express.
Why does my nearly-incompressible model lock?
Almost certainly the element rather than the material. A fully integrated displacement element cannot represent a nearly isochoric deformation without locking.
Hybrid elements are the intended answer. Confirm it by running the same material in a hybrid element before changing anything in the subroutine.