Polyhedra splitting with Mohr-Coulomb-Weibull criterion

Asked by Karol Brzezinski on 2020-12-29

Dear Yade Users,

I am trying to understand and use an implementation of a combined Mohr-Coulomb–Weibull (MCW) failure criterion [1].

I have created an example based on the "splitter.py" example prepared by François Kneib. My example consists of a cube compressed between two walls. I created a polyhedraMat, which is splittable and has defined all the properties of Mohr-Coulomb–Weibull failure criterion. I set all the strengths to 1, probability P=0.63, and high Weibull modulus m=1000 (just in case). I expect to get strength close to 1 Pa. Instead of that, the strength is around 1.6 e5. It is independent of any parameter dedicated for MCW criterion. On the other hand, it depends on "strength" material property (it is not included in the example, but the default value is 100).

Yade version is 2018.02b

The major issue is:
- Do I have to activate the MCW criterion somehow (or deactivate the previous one [2])?

And there are two minor issues that I do not understand:
- Do I have to set "Wei_S0". From what I understood from [1] it is some general value that could be used if the tension and compression strengths were the same. But if I declare both strengths (sigmaCD, sigmaCZ), I expect that Wei_S0 is calculated based on them. Am I right?
- Since the default "strength" is 100, why do I get 1.6e5 in my "experiment"? The scale effect should even decrease strength. In the experiment, the contact force between the wall and the cube is divided by crosssection area (1m2) to calculate stress.


[1] Gladkyy, A., & Kuna, M. (2017). DEM simulation of polyhedral particle cracking using a combined Mohr-Coulomb–Weibull failure criterion. Granular Matter, 19(3), 41.
[2] Eliáš, J. (2014). Simulation of railway ballast using crushable polyhedral particles. Powder Technology, 264, 458-465.
from yade import polyhedra_utils
from yade import plot

def myAddData():
 force = O.forces.f(1)[1]# cube wall interaction
 sig = force/(d**2)
 plot.addData(t = O.time, force = force, sig = sig)

d = 1 # cube length

#cube material
gravel1 = PolyhedraMat()
gravel1.IsSplitable = True
gravel1.Wei_P = 0.63
gravel1.Wei_m = 1000
gravel1.Wei_S0 = 1
gravel1.Wei_V0 = d**3
gravel1.sigmaCD = 1
gravel1.sigmaCZ = 1

#wall material
steel = PolyhedraMat()
steel.young = 1e10
steel.frictionAngle = 0

# create cube
p1 = polyhedra_utils.polyhedra(gravel1, v= [(0,0,0),(0,d,0),(d,d,0),(d,0,0),(0,0,d),(0,d,d),(d,d,d),(d,0,d)])

w1 = utils.wall(+d*1.001, axis=1, sense=-1, material=steel)
w2 = utils.wall(-0.001*d, axis=1, sense=+1, material=steel)

v = 5e-4
w1.state.vel = (0,-v,0)

      [Ig2_Wall_Polyhedra_PolyhedraGeom(), Ig2_Polyhedra_Polyhedra_PolyhedraGeom()],

O.dt= 0.1*polyhedra_utils.PWaveTimeStep()

plot.plot(subPlots =False)

 from yade import qt
 v = qt.View()
 v.ortho = True


Question information

English Edit question
Yade Edit question
No assignee Edit question
Solved by:
Karol Brzezinski
Last query:
Last reply:
Karol Brzezinski (kbrzezinski) said : #1


I just wanted to let you know that I figured it out. I should've used "SplitPolyMohrCoulomb()" instead of "PolyhedraSplitter()".
Still, I get the results twice as big as expected, but it is a minor problem. Besides this, the failure criterion works really cool!