Bonded (CohFrictMat) particles freeze during collision

Asked by Karol Brzezinski

Hi,

Recently I encountered I strange behavior of bonded particles (CohFrictMat). I wanted to simulate gravity deposition, and I noticed that if two agglomerates touch, their velocity drops to zero. This problem occurs if damping > 0 is applied.

Please find MVE below. There are two grains one above another. One of them has prescribed velocity, so it "chases" another one. As soon as they touch, their speed suddenly drops to zero (even though they move in the same direction).
I am using Ubuntu 20.04 and yadedaily 20221027-6847~7952bc1~focal1.

Cheers,
Karol

########### MVE
from yade import plot
####################### params
# default parameters or from table
readParamsFromTable(noTableOk=True,
 youngGrain = 7e9,
 poisson = .3,
 frictionAngle = atan(0.8),
 grainDensity = 2504,
 dtSafetyCohFrictMat = 0.9,
 sphereRadius = 0.15e-2,
 normalCohesion = 1e99,
 shearCohesion = 1e99,

)
from yade.params.table import *

def addPlotData():
 v1 = O.bodies[grain1[0]].state.vel[2]
 v2 = O.bodies[grain2[0]].state.vel[2]
 plot.addData(t = O.time, i = O.iter, v1=v1,v2=v2)

##### material
cfmId = O.materials.append(CohFrictMat(
 young = youngGrain,
 poisson = poisson,
 frictionAngle = frictionAngle,
 density = grainDensity,
 normalCohesion = normalCohesion,
 shearCohesion = shearCohesion,
))

###### spheres

# grain 1
grain1=O.bodies.append([sphere(center=(0,0,1.5*i*sphereRadius),radius=sphereRadius,material = O.materials[cfmId],color=(0,1,0)) for i in [0,1]])

# grain 2
grain2=O.bodies.append([sphere(center=(0,0,0.1+1.5*i*sphereRadius),radius=sphereRadius,material = O.materials[cfmId],color=(0,0,1)) for i in [0,1]])

# prescribe vel of grain 2
for sp in grain2:
 O.bodies[sp].state.vel = (0,0,-0.2)

# engines
O.engines=[
 ForceResetter(),
 InsertionSortCollider([Bo1_Sphere_Aabb(),Bo1_Box_Aabb()]),
 InteractionLoop(
  [Ig2_Sphere_Sphere_ScGeom6D(),Ig2_Box_Sphere_ScGeom()],
  [Ip2_CohFrictMat_CohFrictMat_CohFrictPhys(label = 'phys')],
  [Law2_ScGeom6D_CohFrictPhys_CohesionMoment(label = 'law')],
 ),
 NewtonIntegrator(damping=0.01, gravity = (0,0,-9.81)),
 PyRunner(command = 'addPlotData()', virtPeriod=0.01),
]

phys.setCohesionNow = True # to create cohesive contacts in the next step
## grow particles to create overlap
O.dt = 0
O.step() # do one step in zero timestep just to create interaction

# cancel out the force between the bonded particles
for i in O.interactions:
    i.phys.unp = i.geom.penetrationDepth

# time step
O.dt = dtSafetyCohFrictMat*PWaveTimeStep()

############ prepare plots
plot.plots={'t':('v1','v2')}
plot.plot()

###############################
O.run(int(2e6))

Question information

Language:
English Edit question
Status:
Expired
For:
Yade Edit question
Assignee:
No assignee Edit question
Last query:
Last reply:
Revision history for this message
Karol Brzezinski (kbrzezinski) said :
#1

Hi,

I haven't found out the solution, but I wanted to comment that using very small damping ( <1e-5) seems to give decent results. For some reason, the damping effect is exaggerated for this type of material. Do you have any clue why?

Cheers,
Karol

Revision history for this message
Launchpad Janitor (janitor) said :
#2

This question was expired because it remained in the 'Open' state without activity for the last 15 days.

Revision history for this message
Jérôme Duriez (jduriez) said :
#3

Hi,

Generally speaking, damping does have an exaggerated effect for cohesive brittle materials in the sense it may cancel or not spurious oscillations that would take the interaction beyond its strength limits, or not.

See e.g. § 2.2. in http://dx.doi.org/10.1016/j.engfracmech.2015.12.034 ([Duriez2016] from https://www.yade-dem.org/doc/publications.html) and references therein (a nice figure in Hazzard reference, if I remember correctly)

(Not completely sure if this really relates to your situation, though :-) )

Revision history for this message
Karol Brzezinski (kbrzezinski) said :
#4

Hi,

thank you for your comments. I believe you are talking about this equation (https://gitlab.com/yade-dev/trunk/-/blob/master/pkg/dem/NewtonIntegrator.cpp#L34 ) in a slightly different form. It is hard to imagine how it could have such an effect on the simulation, but it is my strongest lead.

The simulation is more or less predictable when I use the same material for standalone spheres. The same for the case with no damping (or very small <1e-5). However, the damping used in the example (0.01) stops the free-falling aggregates as soon as they touch each other. Moreover, even after the separation, they do not start to fall again.

Cheers,
Karol

PS. I noticed that indentations are broken when the example is copied back to the editor from the launchpad. It was probably poorly formatted in the first place (guilty of using tabs). Sorry for that.

Revision history for this message
Launchpad Janitor (janitor) said :
#5

This question was expired because it remained in the 'Open' state without activity for the last 15 days.

Revision history for this message
Jérôme Duriez (jduriez) said :
#6

> I believe you are talking about this equation (https://gitlab.com/yade-dev/trunk/-/blob/master/pkg/dem/NewtonIntegrator.cpp#L34

This is what I was speaking about. If you have (brittle failure thresholds in your simulation, tendency to oscillations like always in DEM, plus damping that dampens more or less oscillations), I find it more or less natural that damping may have a strong effect since it would change the probability to exceed these failure brittle thresholds during oscillations

(since oscillations are more or less marked depending upon damping)

Revision history for this message
Karol Brzezinski (kbrzezinski) said :
#7

Thank you for your comment. Maybe it is a particular example where damping oscillations 'inside agglomerate' can affect its movement as a whole. This would have to be a strong numerical artifact since it occurs even though the gravity acceleration is not damped.

I prepared another example. Only agglomerate of two grains is free falling, hence there is no impact. The oscillations are introduced after 1e6 of iterations. Adding very small damping causes freezing of the particle. So indeed the oscillations cause the problem.

Cheers,
Karol

############ MWE
########### MVE
from yade import plot
####################### params
# default parameters or from table
readParamsFromTable(noTableOk=True,
    youngGrain = 7e9,
    poisson = .3,
    frictionAngle = atan(0.8),
    grainDensity = 2504,
    dtSafetyCohFrictMat = 0.9,
    sphereRadius = 0.15e-2,
    normalCohesion = 1e10,
    shearCohesion = 1e10,

)
from yade.params.table import *
global introducedOscillations
introducedOscillations = False

def addPlotData():
    global introducedOscillations
    if not(introducedOscillations) and O.iter>1e6:
        O.bodies[grain1[0]].state.pos += Vector3(0,0,1e-5)
        introducedOscillations = True
    v1 = O.bodies[grain1[0]].state.vel[2]
    plot.addData(t = O.time, i = O.iter, v1=v1)

##### material
cfmId = O.materials.append(CohFrictMat(
    young = youngGrain,
    poisson = poisson,
    frictionAngle = frictionAngle,
    density = grainDensity,
    normalCohesion = normalCohesion,
    shearCohesion = shearCohesion,
))

###### spheres

# grain 1
grain1=O.bodies.append([sphere(center=(0,0,1.5*i*sphereRadius),radius=sphereRadius,material = O.materials[cfmId],color=(0,1,0)) for i in [0,1]])

# engines
O.engines=[
    ForceResetter(),
    InsertionSortCollider([Bo1_Sphere_Aabb(),Bo1_Box_Aabb()]),
    InteractionLoop(
        [Ig2_Sphere_Sphere_ScGeom6D(),Ig2_Box_Sphere_ScGeom()],
        [Ip2_CohFrictMat_CohFrictMat_CohFrictPhys(label = 'phys')],
        [Law2_ScGeom6D_CohFrictPhys_CohesionMoment(label = 'law', creep_viscosity = 1000000.)],
    ),
    NewtonIntegrator(damping=0.0, gravity = (0,0,-9.81), dampGravity = False),
    PyRunner(command = 'addPlotData()', virtPeriod=0.01),
]

phys.setCohesionNow = True # to create cohesive contacts in the next step
## grow particles to create overlap
O.dt = 0
O.step() # do one step in zero timestep just to create interaction

# cancel out the force between the bonded particles
for i in O.interactions:
                i.phys.unp = i.geom.penetrationDepth

# time step
O.dt = dtSafetyCohFrictMat*PWaveTimeStep()

############ prepare plots
plot.plots={'t':('v1')}
plot.plot()

###############################
O.run(int(5e6))