How to achieve a twisting/bending-caused bond break in Yade?

Asked by jasperb on 2020-02-29

Hi everybody,

I want to firs describe my current studies background.I am simulating a dynamic scenario: investigating how the rock breaks after impacting with the ground. You know that when a rock impacts the ground with high speed it will splits up into several blocks, but the size/velocity/shape/energy etc. distribution of the split blocks remain unclear. So the JCFpm seems a promising tool. But the problem is that after a month's try, I could not make the block which is made up of thousands of particles break in a reasonable way.
Theoretically, a rock will break up into several parts with certain volume. But when using JCFpm, if the bond strength is high, only several outside particles will detach from the main body ,and if the strength is low, the whole agglomerate will not rebound( looks like glued onto the plane and collapse). In other words, the agglomerate will not split into several blocks. No major crack is found either.
After consulting with some scholars they suggest that this result could stem from the lacking of bending and twisting in bond failure criterion and also the compression failure is common in rock fragmentation. However, to my best knowledge, such feature has not been implemented in Yade yet.
And set aside others' suggestions:
1. What do you think could contribute to the "not able to break into blocks" problem? Is there any suggestion? I am really into Yade and I do not want to switch to BPM in PFC now.
2. Is it easy to add the contribution of twisting and bending in CFm after several days' efforts?( since JCFpm does not support bending and twisting while CFM only considers tension and shear break)

Thanks!

Jasper

Question information

Language:
English Edit question
Status:
Solved
For:
Yade Edit question
Assignee:
No assignee Edit question
Solved by:
Bruno Chareyre
Solved:
2020-03-01
Last query:
2020-03-01
Last reply:
2020-02-29

Hi,
1. I don't know
2. Implementing an upper-bound for twisting and bending moments is trivial. I would actually suggest to do this in the context of cohesiveFrictional functors if you don't use the specific feature of JCFpm (predefined joints). It would need something like this in the source code:
if (condition) broken=true;

That is all. The main question is how to define the condition, and this is up to you.

Bruno

jasperb (jasperb) said : #4

Thanks Bruno Chareyre, that solved my question.

Luc Scholt├Ęs (luc) said : #5

Hi Jasper,

I think you can achieve what you want with the JCFPM. In fact, you can reproduced the effect of bending/twisting resistance by increasing the interaction radius when using the JCFPM. The effect is "similar" in terms of material behavior/strength. Also, as you know, in such context (breakage of samples due to impact), fractures/fragments will develop as a result of the presence of flaws in the material (pre-existing fractures and/or weakness planes), and the JCFPM was made for that purpose and I think it might be relevant for your study.

Also, be aware that the way the numerical sample breaks is directly related to its mechanical properties (and the loading conditions as well). Maybe you could not achieve a "representative" simulation because you chose a non adequate set of parameters?

ANW, please find below a "cartoon" simulation that might be useful for you.

Luc

###

from yade import pack, plot

################# SIMULATIONS DEFINED HERE

#### Material microproperties
intR=1.2 # allows near neighbour interaction (can be adjusted for every packing)

#### material definition
def sphereMat(): return JCFpmMat(type=1,density=3000,young=5e9,poisson=0.2,frictionAngle=radians(15),tensileStrength=5e6,cohesion=5e7)
def wallMat(): return JCFpmMat(type=0,density=3000,young=1e9,poisson=0.2,frictionAngle=radians(15),tensileStrength=0,cohesion=0)

#### create the specimen
pred=pack.inCylinder((0,-0.5,0.5),(0.,0.5,0.5),0.25)
#O.bodies.append(pack.regularHexa(pred,radius=0.025,gap=0.,material=sphereMat))
O.bodies.append(pack.randomDensePack(pred,radius=0.025,rRelFuzz=0.2,useOBB=True,spheresInCell=3000,memoizeDb='/tmp/gts-triax-packings.sqlite',returnSpherePack=False,color=(0.9,0.8,0.6),material=sphereMat))

R=0
Rmax=0
Rmin=1e6
nbSpheres=0.
for o in O.bodies:
 if isinstance(o.shape,Sphere):
   nbSpheres+=1
   R+=o.shape.radius
   if o.shape.radius>Rmax:
     Rmax=o.shape.radius
   if o.shape.radius<Rmin:
     Rmin=o.shape.radius
Rmean=R/nbSpheres

print('nbSpheres=',nbSpheres,' | Rmean=',Rmean, ' | Rmax/Rmin=', Rmax/Rmin)

O.bodies.append(geom.facetBox((0,0,0),(2,2,1),Quaternion((1,1,0),pi/20.),wallMask=16,color=(1,1,1),wire=False,fixed=1,material=wallMat))

################# ENGINES DEFINED HERE

O.engines=[
    ForceResetter(),
    InsertionSortCollider([Bo1_Sphere_Aabb(aabbEnlargeFactor=intR,label='Saabb'),Bo1_Facet_Aabb()]),
    InteractionLoop(
        [Ig2_Sphere_Sphere_ScGeom(interactionDetectionFactor=intR,label='SSgeom'),Ig2_Facet_Sphere_ScGeom()],
        [Ip2_JCFpmMat_JCFpmMat_JCFpmPhys(cohesiveTresholdIteration=1,label='interactionPhys')],
        [Law2_ScGeom_JCFpmPhys_JointedCohesiveFrictionalPM(recordCracks=True,Key='test',label='interactionLaw')]
    ),
    GlobalStiffnessTimeStepper(active=1,timeStepUpdateInterval=10,timestepSafetyCoefficient=0.9,defaultDt=utils.PWaveTimeStep()),
    NewtonIntegrator(damping=0.4,gravity=(0,0,-100)),
    VTKRecorder(iterPeriod=2000,initRun=True,fileName='fallingBlock-',recorders=['facets','spheres','jcfpm','cracks'],Key='test',label='vtk')
]

################# PREPROCESSING

#### manage interaction detection factor during the first timestep and then set default interaction range
O.step();
### initializes the interaction detection factor
SSgeom.interactionDetectionFactor=-1.
Saabb.aabbEnlargeFactor=-1.

#### coordination number verification
numSSlinks=0
numCohesivelinks=0
for i in O.interactions:
    if isinstance(O.bodies[i.id1].shape,Sphere) and isinstance(O.bodies[i.id2].shape,Sphere):
      numSSlinks+=1
    if i.phys.isCohesive :
      numCohesivelinks+=1

print ("nblinks=", numSSlinks, " | nbCohesivelinks=", numCohesivelinks, "|| Kcohesive=", 2.0*numCohesivelinks/nbSpheres)

#### delete floating particles
Kmin=3
erased=0
for o in O.bodies:
    if isinstance(o.shape,Sphere):
        nbCont=0
        for i in O.interactions.withBody(o.id) :
            if not i.isReal : continue
            if i.phys.isCohesive:
                nbCont+=1
        if nbCont<Kmin:
            erased+=1
            O.bodies.erase(o.id)
print 'nb of floating particles (erased) = ', erased

################# SIMULATION REALLY STARTS HERE
O.run(14000)

@Luc
Do you mean that JCFpm has upper bounds for torques at interactions?
I thought rolling friction in the CohesiveFrictional law was the only concrete example of such thing atm.
Bruno

Luc Scholt├Ęs (luc) said : #7

@Bruno

Yes, you are right, JCFPM does not consider rolling/twisting resitance in its formulation. But, increasing the number of bonds between particles (by allowing near neighbor bonding) increases their degree of interlocking. My interpretation is that the macroscopic consequence of this enhanced interlocking is"similar" to what you would obtain with a rolling resistance since the movements (i.e. translation and rotation) of the particles are limited. This, of course, only applies when the material is mostly cohesive (when particles are bonded). But, to be honest, I don't have any quantitative proof of this supposed macroscopic "similarity".

Luc

Robert Caulk (rcaulk) said : #8

I once added rolling/twisting resistance to JCFpm. It was not too difficult: just add all the necessary members/if statements as shown in cohesivefrictional. But in the end, it didn't make a difference while studying wing cracks. I get the feeling rolling and twisting might play negligible roles in cohesive materials for DEM (or maybe the interaction range dominated as luc is pointing out?). Meanwhile, rolling and twisting seems to be indispensable in non-cohesive DEM models for obtaining shear bands.