Von Mises model
An implementation of classical J2 plasticity with isotropic hardening.
Index |
Model Parameter |
Description |
|---|---|---|
0 |
\(E\) |
Young’s modulus |
1 |
\(\nu\) |
Poisson’s ratio |
2 |
\(f_\mathrm{y}^{0}\) |
Initial yield stress |
3 |
\(H_\mathrm{iso,lin}\) |
First hardening parameter [1] |
4 |
\(\Delta f_\mathrm{y}^{0,\infty}\) |
Second hardening parameter [1] |
5 |
\(\delta\) |
Third hardening parameter [1] |
State Variable |
Name |
Description |
|---|---|---|
\(\kappa\) |
|
Hardening variable [1] |
Theory
Elastoplastic Constitutive Relations
The infinitesimal elastoplastic constitutive relations, which relate the stress and linearized strain rate tensors by means of the elastic continuum tangent operator, are given as
Therein, an additive split of the strain rate tensor in elastic and plastic parts is assumed.
The elastic continuum tangent operator is given in terms of Young’s modulus \(E\) and Poisson’s ratio \(\nu\) as
Alternatively, the constitutive relations can be rewritten based on a volumetric-deviatoric split of the stress and strain rate tensors
and
as
Yield Function
The yield function, which is formulated in terms of the deviatoric part of the stress tensor is given as
where \(f_\mathrm{y}\left(\kappa\right)\) is the yield stress under uniaxial tension, which may depend on the hardening variable \(\kappa\).
Flow Rule
The model encompasses associated plastic flow, i.e., the plastic strain rate
is proportional to the partial derivatives of the yield function with respect to the stress tensor. The plastic multiplier \(\dot{\lambda}\) is a proportionality constant.
Hardening Law
The model includes non-linear isotropic hardening, which is controlled by the evolution of the yield stress as
Therein, \(f_\mathrm{y}^0\), \(H_\mathrm{iso,lin}\), \(\Delta{}f_\mathrm{y}^{0,\infty}\) and \(\delta\) are material parameters.
The evolution of the hardening variable is given as
Therein, the factor \(\sqrt{\frac{2}{3}}\) ensures that \(\dot{\kappa}\) is equal to \(\dot{\varepsilon}^\mathrm{p}_{11}\) for uniaxial loading in \(x_1\) direction.
Loading-Unloading Conditions, Consistency Condition
The plastic multiplier and the yield function obey the Karush–Kuhn–Tucker conditions
as well as the consistency condition
Implementation
The model is implemented using an (implicit) backward Euler integration scheme. Given the stress tensor \(\boldsymbol{\sigma}^{n}\) and the value of the state variable \(\kappa^{n}\) at time \(t^{n}\) as well as an increment of the linearized strain tensor \(\Delta\boldsymbol{\varepsilon}=\boldsymbol{\varepsilon}^{n+1}-\boldsymbol{\varepsilon}^{n}\), an updated stress tensor \(\boldsymbol{\sigma}^{n+1}\) as well as an updated value of the state variable \(\kappa^{n+1}\) at time \(t^{n+1}\) are calculated by means of the stress update algorithm outlined below.
Stress Update Algorithm
Given the strain increment \(\Delta\boldsymbol{\varepsilon}\), an elastic trial stress is calculated as
If the trial stress does not satisfy the yield condition, i.e., \(f\left(\boldsymbol{\boldsymbol{\sigma}^\mathrm{trial}},\kappa_n\right)<0\), the step is treated as elastic, which means that the updated stress is equal to the trial stress
and the hardening variable remains constant
If the trial stress satisfies the yield condition, i.e., \(f\left(\boldsymbol{\boldsymbol{\sigma}^\mathrm{trial}},\kappa_n\right)\geq0\), the step is treated as elastoplastic, triggering the radial return mapping algorithm.
The updated deviatoric stress \(\boldsymbol{s}^{n+1}\) can be written as
Taking the norm on both sides results in
Inserting the resulting expression for \(\|\boldsymbol{s}^{n+1}\|\) into the yield function \(f^{n+1}\)
and substituting \(\Delta\lambda\) with \(\sqrt{\frac{3}{2}}\Delta\kappa\) results in the scalar expression
which can be solved numerically to obtain \(\Delta\kappa\).
If \(\Delta\kappa\) is known, the state variable is updated as
and the stress update is performed by exploiting \(\Delta\lambda=\sqrt{\frac{3}{2}}\Delta\kappa\)
Consistent Algorithmic Tangent Operator
The consistent tangent operator is given as
-
class VonMisesModel : public MarmotMaterialHypoElastic
Inheritance diagram for Marmot::Materials::VonMisesModel:
![digraph {
graph [bgcolor="#00000000"]
node [shape=rectangle style=filled fillcolor="#FFFFFF" font=Helvetica padding=2]
edge [color="#1414CE"]
"1" [label="Marmot::Materials::VonMisesModel" tooltip="Marmot::Materials::VonMisesModel" fillcolor="#BFBFBF"]
"2" [label="MarmotMaterialHypoElastic" tooltip="MarmotMaterialHypoElastic"]
"1" -> "2" [dir=forward tooltip="public-inheritance"]
}](../../_images/graphviz-110e4e59bbc133e9e0aeafa6cd2d9eb01f1bd6ab.png)
Collaboration diagram for Marmot::Materials::VonMisesModel:
![digraph {
graph [bgcolor="#00000000"]
node [shape=rectangle style=filled fillcolor="#FFFFFF" font=Helvetica padding=2]
edge [color="#1414CE"]
"1" [label="Marmot::Materials::VonMisesModel" tooltip="Marmot::Materials::VonMisesModel" fillcolor="#BFBFBF"]
"2" [label="MarmotMaterialHypoElastic" tooltip="MarmotMaterialHypoElastic"]
"3" [label="MarmotStateLayoutDynamic" tooltip="MarmotStateLayoutDynamic"]
"1" -> "2" [dir=forward tooltip="public-inheritance"]
"2" -> "3" [dir=forward tooltip="usage"]
}](../../_images/graphviz-11cea75bfc45fd250fcaa9dc95b5d41532ccf3d4.png)
An implementation of classical J2 plasticity with isotropic hardening.
Public Functions
-
VonMisesModel(const double *materialProperties, const int nMaterialProperties, const int materialLabel)
-
virtual void computeStress(state3D &state, Marmot::Matrix6d &dStressDDStrain, const Marmot::Vector6d &dStrain, const timeInfo &timeInfo) const override
For a given linearized strain increment \(\Delta\boldsymbol{\varepsilon}\) at the old and the current time, compute the Cauchy stress and the algorithmic tangent \(\frac{\partial\boldsymbol{\sigma}^{(n+1)}}{\partial\boldsymbol{\varepsilon}^{(n+1)}}\).
- Parameters:
state – [inout] A state3D instance carrying stress, strain energy, and state variables
dStress_dStrain – [inout] Algorithmic tangent representing the derivative of the Cauchy stress tensor with respect to the linearized strain
dStrain – [in] linearized strain increment
timeInfo – Structure carrying the current (pseudo-)time and the (pseudo-)time increment
-
virtual void computeStressExplicit(state3D &state, const Marmot::Vector6d &dStrain, const timeInfo &timeInfo) const override
Explicit version of computeStress for use in explicit time integration schemes. The algorithmic tangent is not needed in explicit schemes and will therefore not be computed.
Note
The default implementation calls computeStress and ignores the algorithmic tangent.
Note
Derived classes may override this method for efficiency reasons.
- Parameters:
state – [inout] A state3D instance carrying stress, strain energy, and state variables
dStrain – [in] linearized strain increment
timeInfo – Structure carrying time information
-
virtual double getDensity(const double *stateVars) const override
Get the mass density of the material.
- Parameters:
stateVars – Pointer to the state variable array
- Returns:
Mass density of the material
-
VonMisesModel(const double *materialProperties, const int nMaterialProperties, const int materialLabel)