linearElasticMohrCoulombPlastic
Small-strain elasto-plasticity with incremental isotropic Hookean elasticity and a non-associated Mohr-Coulomb yield surface, returned in principal-stress space. The runtime type is:
linearElasticMohrCoulombPlastic
It is normally used as the effective-stress law inside poroMechanicalLaw. The dictionary layout common to all laws is described in the material models page.
User Guide
What it computes
The stress is carried as a variation deltaSigma from the initial stress sigma0. At each integration point a trial stress is built from the strain increment over the time step and the previous step's variation:
DEpsilon = symm(grad(D)) - symm(grad(D)_0)
DSigmaTrial = 2*mu*DEpsilon + lambda*tr(DEpsilon)*I
sigmaTrial = deltaSigma_0 + DSigmaTrial + sigma0
mu = E/(2*(1 + nu))
lambda = nu*E/((1 + nu)*(1 - 2*nu)) // plane strain / 3-D
lambda = nu*E/((1 + nu)*(1 - nu)) // planeStress yes
The principal stresses of the trial stress are ordered sigma1 >= sigma2 >= sigma3 and the yield function is evaluated:
k = (1 + sin(frictionAngle))/(1 - sin(frictionAngle))
m = (1 + sin(dilationAngle))/(1 - sin(dilationAngle))
f = k*sigma1 - sigma3 - 2*cohesion*sqrt(k)
If f > SMALL, the principal stresses are returned to a plane, an edge or the apex of the yield surface, using k for the yield surface and m for the plastic flow direction, and transformed back to tensor form. Otherwise the trial stress is kept. Finally deltaSigma = sigma - sigma0 is stored.
Because the trial stress is built on the stored deltaSigma rather than on the stress already held by the solid model, the law works under poroMechanicalLaw, which subtracts the pore pressure afterwards.
The law is small-strain only; a nonlinear geometry solid model stops with an error.
Model options
| Entry | Required | Default | Description |
|---|---|---|---|
rho | yes | - | Density, [1 -3 0 0 0 0 0] |
E | yes | - | Young's modulus, [1 -1 -2 0 0 0 0] |
nu | yes | - | Poisson's ratio, [0 0 0 0 0 0 0] |
frictionAngle | yes | - | Friction angle in degrees, dimensionless |
cohesion | yes | - | Cohesion, [1 -1 -2 0 0 0 0] |
dilationAngle | yes | - | Dilation angle in degrees, dimensionless |
When the law is nested inside poroMechanicalLaw, rho is taken from the enclosing law's dictionary and need not be repeated. planeStress is the top-level entry of mechanicalProperties and changes lambda as shown above.
There is no range check on nu, frictionAngle or dilationAngle. The apex stress is 2*cohesion*sqrt(k)/(k - 1), which is singular for a zero friction angle, so frictionAngle must be non-zero. For a pressure-independent yield surface use linearElasticMisesPlastic instead.
Initial stress
The initial stress is read from a volSymmTensorField named sigma0 in the start time directory (or in 0), if one exists; otherwise it is zero. Unlike linearElastic, there is no sigma0 dictionary entry.
Tangents and volumetric split
- Scalar tangent: the elastic value
2*mu + lambda, also returned when the deviatoric scalar tangent is asked for. - Fourth-order tangent:
fourthOrderFiniteDifferenceonly. Asking for the analyticalfourthOrdertangent is a fatal error. - Volumetric split: no. The law cannot be used with
solvePressureEqnor with the mixed displacement-pressure formulations, which refuse it at start-up.
State variables
| Name | Type | Role | Description |
|---|---|---|---|
deltaSigma | symmTensor | persistent | Stress variation from sigma0 |
activeYield | scalar | persistent | 1 where yielding, else 0 |
sigma0 | symmTensor | prescribed | Initial stress, read from a field |
At each write time, for cell-centred solid models, each persistent variable is written as a volField named after it (deltaSigma, activeYield) for viewing. The restart data are written alongside as <material>_<topology>_<variable>; when the law is nested inside poroMechanicalLaw the sub-law's name is included, for example soil_cellCentredIntegrationPointTopology_effectiveStressMechanicalLaw_deltaSigma. To restart a run from a later time, set restart yes; in the solid model's coefficients dictionary from the start of the run.
Example
From the stripFooting tutorial:
planeStress no;
mechanical
(
soil
{
type poroMechanicalLaw;
rho rho [1 -3 0 0 0 0 0] 7854;
biotCoeff biotCoeff [0 0 0 0 0 0 0] 1.0;
effectiveStressMechanicalLaw
{
type linearElasticMohrCoulombPlastic;
E E [1 -1 -2 0 0 0 0] 20e6;
nu nu [0 0 0 0 0 0 0] 0.3;
frictionAngle frictionAngle [0 0 0 0 0 0 0] 30;
dilationAngle dilationAngle [0 0 0 0 0 0 0] 0;
cohesion cohesion [1 -1 -2 0 0 0 0] 1e5;
}
}
);
Migrating from the legacy law
regionNameis no longer read. The legacy law silently ignoredsolvePressureEqn; the solid model now refuses it for this law.- The legacy check that
frictionAnglehas a magnitude of at least1e-3degrees is not present, and no warning is given for a zerosigma0. - Only
deltaSigmaandactiveYieldare kept. The accumulated plastic strainepsilonP,epsilonPEqand the incrementsDEpsilonandDEpsilonPare no longer computed or written, and the end-of-step report of plastic strain and yielding cells is gone. - The strain increment is taken from the displacement gradient and its old-time value, rather than from stored
epsilonfields. - The law now serves every integration-point location, and a fourth-order tangent is available by finite differences.
Tutorials
Both select this law inside the effectiveStressMechanicalLaw sub-dictionary of poroMechanicalLaw: