Constitutive Models and Plasticity#
This chapter develops the mathematical foundations for plasticity models in femlabpy.materials. We derive the von Mises and Drucker-Prager yield criteria, establish the return mapping algorithms, and connect them to the implementation.
1. Stress Invariants and Decomposition#
1.1 Stress tensor decomposition#
Any stress tensor \(\boldsymbol{\sigma}\) can be decomposed into volumetric (hydrostatic) and deviatoric parts:
where the mean (hydrostatic) stress is:
and the deviatoric stress tensor is:
In Voigt notation for 3D: \(\mathbf{S} = [\sigma_{xx}, \sigma_{yy}, \sigma_{zz}, \sigma_{xy}, \sigma_{yz}, \sigma_{zx}]^T\), the deviatoric components are:
1.2 Principal stress invariants#
The three invariants of the stress tensor are:
The deviatoric invariants \(J_2\) and \(J_3\) are defined as:
Expanding \(J_2\) in terms of Voigt components:
1.3 Von Mises equivalent stress#
The von Mises equivalent stress (or effective stress) is defined as:
This can be written explicitly as:
For plane stress (\(\sigma_{zz} = \sigma_{yz} = \sigma_{zx} = 0\)):
This is implemented in eqstress(S).
2. Von Mises Yield Criterion#
2.1 Yield function#
The von Mises yield criterion states that yielding occurs when the equivalent stress equals the yield stress:
This defines a cylindrical yield surface in principal stress space, with axis along the hydrostatic line \(\sigma_1 = \sigma_2 = \sigma_3\).
2.2 Isotropic hardening#
With linear isotropic hardening, the yield stress evolves with accumulated plastic strain:
where:
\(\sigma_{y0}\) is the initial yield stress
\(H\) is the hardening modulus
\(\bar{\varepsilon}^p\) is the equivalent plastic strain
The increment of equivalent plastic strain is related to the plastic multiplier \(\Delta\lambda\) by:
2.3 Associative flow rule#
The plastic strain rate follows the normality rule (associated flow):
The direction tensor (normal to the yield surface) is:
2.4 Elastic-plastic tangent modulus#
The consistent (algorithmic) tangent for 3D is:
For radial return in 3D von Mises plasticity, this simplifies because the elastic stiffness \(\mathbf{D}\) can be split into deviatoric and volumetric parts.
3. Return Mapping Algorithm#
3.1 Elastic predictor#
Given the strain increment \(\Delta\boldsymbol{\varepsilon}\), compute the trial (elastic) stress:
where \(\boldsymbol{\sigma}_n\) is the stress at the end of the previous increment.
3.2 Yield check#
Evaluate the yield function at the trial state:
If \(f^{trial} \leq 0\), the step is elastic: \(\boldsymbol{\sigma}_{n+1} = \boldsymbol{\sigma}^{trial}\).
If \(f^{trial} > 0\), plastic correction is needed.
3.3 Plastic corrector (3D radial return)#
For J2 plasticity in 3D, the return mapping has a closed-form solution. The deviatoric trial stress is:
The plastic multiplier is found by enforcing the consistency condition:
This gives:
where \(G = \frac{E}{2(1+\nu)}\) is the shear modulus.
The corrected deviatoric stress is:
The updated stress is:
3.4 Plane stress return mapping#
Under plane stress constraints (\(\sigma_{zz} = 0\)), the radial return is no longer closed-form. The constraint must be enforced iteratively.
The residual system involves finding \(\Delta\lambda\) such that:
The implementation uses Newton-Raphson iteration on the scalar consistency equation. Functions yieldvm(S, G, dL, Sy) and dyieldvm(S, G, dL, Sy) evaluate the residual and its derivative.
The iteration proceeds:
until \(|f| < \text{tol}\).
4. Drucker-Prager Plasticity#
The Drucker-Prager criterion models pressure-dependent yielding, relevant for soils, rocks, and concrete.
4.1 Yield function#
where \(\phi\) is the friction parameter controlling pressure sensitivity.
When \(\phi = 0\), this reduces to von Mises plasticity.
4.2 Geometric interpretation#
In principal stress space, the Drucker-Prager surface is a cone with:
Apex on the hydrostatic axis
Cone angle determined by \(\phi\)
Von Mises cylinder as the limiting case (\(\phi \to 0\))
4.3 Flow rule and derivatives#
The gradient of the yield function:
This non-deviatoric term means plastic dilation (volume change) accompanies yielding.
4.4 Drucker-Prager return mapping#
The stressdp function implements a coupled Newton iteration solving for both stress correction \(\Delta\mathbf{S}\) and plastic multiplier \(\Delta\lambda\) simultaneously.
The residual vector is:
The \(4 \times 4\) tangent system (for 3 stress components + multiplier) is solved at each iteration:
5. Material Row Layout#
The plasticity routines expect material parameters in a flat array:
Index |
Parameter |
Description |
|---|---|---|
0 |
\(E\) |
Young’s modulus |
1 |
\(\nu\) |
Poisson’s ratio |
2 |
\(\sigma_{y0}\) |
Initial yield stress |
3 |
\(H\) |
Hardening modulus |
4 |
\(\phi\) |
Friction parameter (Drucker-Prager only) |
6. Implementation Summary#
Module structure#
Function |
Description |
|---|---|
|
Splits stress into deviatoric and mean parts |
|
Computes von Mises equivalent stress |
|
Evaluates plane-stress consistency residual |
|
Derivative of consistency residual |
|
Plane-stress von Mises return mapping |
|
Drucker-Prager return mapping |
Design principles#
Pure functions: Invariant helpers do not mutate inputs
Explicit state: Trial stress, plastic multiplier, and corrected stress are separate variables
Local solvers: Each material call is self-contained; no global state caching
Modular tangent: Consistent tangent computed at solver level, not material level
Source file locations#
femlabpy/
├── materials/
│ ├── __init__.py # Public exports, devstres alias
│ ├── invariants.py # devstress, eqstress
│ └── plasticity.py # yieldvm, dyieldvm, stressvm, stressdp