# 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?

## Question information

Language:
English Edit question
Status:
Solved
For:
Assignee:
No assignee Edit question
Solved by:
Jan Stránský
Solved:
2020-05-19
Last query:
2020-05-19
2020-05-07
 Jan Stránský (honzik) said on 2020-05-07: #1

Hello,

- 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

cheers
Jan

PS: there is a bug in the current implementation ...

 chanaka Udaya (chanaka-udaya) said on 2020-05-07: #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/dUs_Pl)=k_s*(1-D_old)
(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))
delta_Us_Pl=d_lambda*(dg/dsigmaS)
|Us_pl|=|Us_Pl_old|+ delta_Us_Pl
D=1-exp(-|Us_Pl|/constant)
|sigma_S|=|sigma_S_trial|*(1-D)/(1-D_old)-k_s*(1-D)*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

Thanks Jan Stránský (honzik) said on 2020-05-07: #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?

cheers
Jan

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 on 2020-05-19: #4

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