Exponential softening shear force after peak- model implementation

Asked by chanaka Udaya on 2020-05-07

Dear all,

I'm trying to obtain an exponential softening shear behavior (damage-plasticity) after peak stress instead of Mohr-coulomb failure with cohesion which is currently implemented CPM model in Yade.
shear stress will be calculated as follows,

sigma_S= k_s*(1-D)*(Us-Us_Pl) where D is scalar damage variable and sigma_S,Us, Us_Pl are vectors

D=1- exp(-|Us_pl|/constant); where , |*| : maginitude

and yield criteria is

F=|sigma_S|- Cohesion*(1-D) , cohesion is scalar value say ,1e6 like that

from yield function F, I can calculate the scalar value of plastic shear displacement, but the problem is how to update the plastic shear displacement vector?

Could you please help me to solve this issue?

Question information

English Edit question
Yade Edit question
No assignee Edit question
Solved by:
Jan Stránský
Last query:
Last reply:
Jan Stránský (honzik) said : #1


just follow standard plasticity concepts:
- you know current total displacement dTot and plastic displacement dPl
- compute elastic displacement dEl = dTot - dPl
- compute trial stress sTrial = k * dEl
- do stress return to admissible value according to F (possibly also involving change of damage) => sActual
- compute "plastic stress" sPlastic = sTrial - sActual
- plastic strain increment is simply sPlastic / k


PS: there is a bug in the current implementation [1]...
[1] https://gitlab.com/yade-dev/trunk/-/blob/master/pkg/dem/ConcretePM.cpp#L436

chanaka Udaya (chanaka-udaya) said : #2

Dear Dr. Jan Stransky,

I have followed the following steps to obtain scalar shear stress value(|sigma_S|) which is same as your sActual value magnitude

delta_us= Us.norm()- Us_old.norm() ; where, Us_old is shear displacement at previous step and delta_Us: scalar shear displacement increment

|sigma_S_trial|=Sigma_S_old+ k_s*(1-D_old)*delta_us trial stress calculation

F_trial=|sigma_S_trial|- Cohesion*(1-D_old) evaluate yield function

If F_trial>0
      (dF/dsigmaS)=sign(sigmaS)=+1 partial derivatives to calculate plastic multiplier
      (dsigma_S/dD)= k_s*(Us.norm()-|Us_Pl_old|)
      (dD/dUs_pl)= Exp(-|UsPl_old|/constant)/constant

assuming associate flow rule to calculate plastic multiplier (d_lambda) that means, (dg/dsigmaS)= (dF/dsigmaS) where g-plastic potential

      d_lambda= -F_trial/((dF/dsigmaS)*(dsigmaS/dUs_Pl)*(dg/dsigmaS)+(dF/dsigmaS)* (dsigma_S/dD)* (dD/dUs_pl)*(dg/dsigmaS))
      |Us_pl|=|Us_Pl_old|+ delta_Us_Pl

Based on the above calculation I only know the scalar actual shear stress,(|sigmaS|) and scalar shear plastic displacement, (|Us_Pl), at the current step

But I need the vector value of shear plastic displacement to apply the shear force using the below equation at the contact point

Fs=k_s*(1-D)*(Us-UsPl)*|crossSection_area| where Fs is shear force vector

I still couldn't understand how to get that Us_Pl vector


Best Jan Stránský (honzik) said : #3

There are some misconceptions in your formulas.
Specifically, do not use scalars where there should be vectors or even tensors (then you will not end with a scalar while expecting a vector).

below (to make it mode readable) s=stress, u=displacement, up=plastic displacement, k=stiffness

> (dF/ds)=sign(s)=+1
> dup=d_lambda*(dg/ds)
F,g ... scalar
s ... vector
dF/ds and gd/ds ... has to be vector
dF/ds = d(|s|)/ds = s / |s|

try a re-derivation. If the re-derivation does not help, I suggest to switch to personal conversation, as the topic is not really Yade related..

> (dsigma_S/dUs_Pl)=k_s*(1-D_old)

shouldn't D be treated as a function of us_pl?


d(|s|) / ds =
= d(sqrt(s.dot(s)) / ds =
= 1/2 * 1/sqrt(s.dot(s)) * d(s.dot(s)) / ds =
= 1/2 * 1/|s| * d(s.dot(s)) / ds =
= 1/2 * 1/|s| * (1*s + s*1) =
= s / |s|

chanaka Udaya (chanaka-udaya) said : #4

Thanks Jan Stránský, that solved my question.