Clumping - angl of repose

Asked by Seti on 2016-04-17

Hi all,

In below code I have tried to study the effect of percentage/ratio of clumping on repose angle. before adding the clumping section the scrip worked properly however by adding clump grain do not fall down because of their gravity and the sample explodes .

Would you please advise?

Thanks
#!/usr/bin/python
from yade import pack,utils, qt, plot
pred = pack.inAlignedBox((0,0,0),(14.5,14.5,14.5))
#create material
soil1 = CohFrictMat(young=30e9,poisson=0.3,frictionAngle=radians(30),density=2600.0,normalCohesion=1e6, shearCohesion=80e6,label='soil')
#color=(1,0,0) ----red color
#soil1 = FrictMat(young=1e6,poisson=0.4,frictionAngle=radians(30),density=2500.0,label='soil')
O.materials.append(soil1)
O.bodies.append(utils.wall(0,axis=1,sense=1))
O.materials.append(CohFrictMat(young=30e9,poisson=0.3, frictionAngle = radians(30) , label='wallmat'))
wallmat = O.materials[-1]
45
spheres=SpherePack()
spheres=pack.randomDensePack(pred,radius=.5,material='soil',spheresInCell=1000,color=(1,0,0),returnSpherePack=True)
spheres.toSimulation()
#O.bodies.append(spheres)
#

#
O.engines=[
             ForceResetter(),#reset forces
             InsertionSortCollider([Bo1_Wall_Aabb(),Bo1_Sphere_Aabb()]),
             InteractionLoop(
                            [Ig2_Sphere_Sphere_ScGeom6D(),Ig2_Wall_Sphere_ScGeom()], # collision geometry
                            [Ip2_CohFrictMat_CohFrictMat_CohFrictPhys()], # collision "physics"
                            [Law2_ScGeom6D_CohFrictPhys_CohesionMoment(),Law2_ScGeom_FrictPhys_CundallStrack()] # contact law -- apply forces
                                            ),
                      # apply gravity force to particles
                            # damping: numerical dissipation of energy
              NewtonIntegrator(damping=0.5,gravity=(0,-9.81,0)),
                            #qt.SnapshotEngine(fileBase='3d-',iterPeriod=200,label='snapshot'),
   # this engine will be called after 20000 steps, only once

              PyRunner(command='checkUnbalanced()',realPeriod=200,label='checker'),
              PyRunner(command='addPlotData()',iterPeriod=200)
]
 #############################CLUMPING###########################################

#create a box:
#id_box = O.bodies.append(box((0,0,0),(.0045,0.0045,.0045),fixed=True,material=Mat))

#create assembly of spheres:
#sp=pack.SpherePack()
#sp.makeCloud((0,0,0),(.004,0.004,.004),rMean=.00018,rRelFuzz=.0001,num=1000,periodic=False)
#O.bodies.append([sphere(c,r,material=Mat) for c,r in sp])

#print len(sp),' particles generated.'
print 'Roundness coefficient without clumps is: ',O.bodies.getRoundness()

#### show how to use makeClumpTemplate():

#dyad:
#relRadList1 = [.0002,.0002]
#relPosList1 = [[.0003,0,0],[0.0006,0,0]]

#peanut:
relRadList2 = [.0002,0.0004,0.0002]
relPosList2 = [[0.0003,0,0],[0,0,0],[0.0006,0,0]]

#stick:
#relRadList3 = [1,1,1,1,1]
#relPosList3 = [[0,1,0],[0,2,0],[0,3,0],[0,4,0],[0,5,0]]

templates= []
#templates.append(clumpTemplate(relRadii=relRadList1,relPositions=relPosList1))
templates.append(clumpTemplate(relRadii=relRadList2,relPositions=relPosList2))
#templates.append(clumpTemplate(relRadii=relRadList3,relPositions=relPosList3))

#### show how to use replaceByClumps():

#replace by 50% dyads, 30% peanuts and 10% sticks:
#O.bodies.replaceByClumps(templates,[.5,.3,.1])
O.bodies.replaceByClumps(templates,[0.5])

#### show how to use getRoundness():

#create a list of all standalone spheres:
standaloneList = []
for b in O.bodies:
 if b.isStandalone:
  standaloneList.append(b.id)

print 'Roundness coefficient for spheres and clumps is: ',O.bodies.getRoundness()
print 'Roundness coefficient just for clumps is: ',O.bodies.getRoundness(standaloneList)

#sp.toSimulation()

print 'Number of elements: ', len(O.bodies)
print 'Box Volume: '
print 'Clumprepose,0.5,.25,30,3grain,0.5%'
O.trackEnergy=True
# set timestep to a fraction of the critical timestep
# the fraction is very small, so that the simulation is not too fast
# and the motion can be observed
O.dt=1*utils.PWaveTimeStep()
#makeVideo(snapshot.snapshots,'3d.mpeg',fps=10,bps=10000)
# save the simulation, so that it can be reloaded later, for experimentation
#O.saveTmp()0
#checker.command='stopUnloading()'
def checkUnbalanced():
   if unbalancedForce()<5e-2:
      print('Reached target , stopping')
      O.pause()
      plot.saveDataTxt('Clumprepose,0.5,.5,30,3grain,0.5%.bz2')
      plot.saveDataTxt('Clumprepose,0.5,.5,30,3grain,0.5%.txt')
#plot.saveDataTxt('modi.data.bz2')
      # plot.saveGnuplot('bbb') is also possible

# collect history of data which will be plotted

def addPlotData():
   # each item is given a names, by which it can be the unsed in plot.plots
   # the **O.energy converts dictionary-like O.energy to plot.addData arguments
   plot.addData(i=O.iter,unbalanced=unbalancedForce(),**O.energy)
#O.save('Modifiedd.txt.bz2')
#while 1:
 #O.run(100,True)
 #if unbalancedForce()<1e-5:
  #break
plot.plots={'i':('unbalanced',None,O.energy.keys)}
plot.plot()

O.saveTmp()

#plot.saveDataTxt('2')
from yade import qt
qt.View()

Question information

Language:
English Edit question
Status:
Answered
For:
Yade Edit question
Assignee:
No assignee Edit question
Last query:
2016-05-05
Last reply:
2016-05-09
Klaus Thoeni (klaus.thoeni) said : #1

Hi,

you are using randomDensePack to generate your assembly. The function uses TriaxialTest [1] so the packing you get is most certain not stress-free, i.e., particles will have overlap, hence you get an explosion. This should be the case for spheres and clumps. Try using makeCloud [2] instead or make your dense sample stress-free by shrinking the spheres which overlap.

HTH
K

[1] https://yade-dem.org/doc/yade.pack.html?highlight=randomdensepack#yade.pack.randomDensePack
[2] https://yade-dem.org/doc/yade.pack.html?highlight=makecloud#yade._packSpheres.SpherePack.makeCloud

Seti (seti) said : #2

Hi Kalus,
Thanks for your response . I have tried to use mackeCloud , easily as per below, However I have the same problem. Would you please?

from yade import pack,utils, qt, plot

#create material
soil1 = CohFrictMat(young=30e9,poisson=0.3,frictionAngle=radians(30),density=2600.0,normalCohesion=1e6, shearCohesion=80e6,label='soil')
#color=(1,0,0) ----red color

O.materials.append(soil1)
O.bodies.append(utils.wall(0,axis=1,sense=1))
O.materials.append(CohFrictMat(young=30e9,poisson=0.3, frictionAngle = radians(30) , label='wallmat'))
wallmat = O.materials[-1]

sp=SpherePack()
sp.makeCloud((0,0,0),(14.5,14.5,14.5),rMean=0.5,rRelFuzz=0.0)
#sp.makeCloud((0,0,0),(14.5,14.5,14.5),rMean=0.2,rRelFuzz=0.0,False,0.95,[0.2,0.3,0.4,0.5,0.6,0.7,0.8],[0.14,0.28,0.34,0.50,0.65,0.85,1.00])
#spheres.toSimulation()
sp.toSimulation()
#O.bodies.append(spheres)

Seti (seti) said : #3

I think this explosion is depended on percentage of clumping . I mean by increasing the ratio of clumping the sample explode sooner. I am not sure what is the conflict.
Does anybody experience in this regard.

Thanks
Seti

Jérôme Duriez (jduriez) said : #4

Have you tried to play with (decrease) the timestep ? Excessively high timesteps are a classical reason for "explosion"

Seti (seti) said : #6

Yes, I have even tried O.dt=.1*utils.PWaveTimeStep() , no difference!

Christian Jakob (jakob-ifgt) said : #7

Hi,

I did not investigate your script very deeply, but I guess the explosion arises from replaceByClumps() function.

A workaround for avoiding explosions is given in the original example line 81 and following ...

https://github.com/yade/trunk/blob/master/examples/clumps/replaceByClumps-example.py#L81

Cheers,

Christian

Can you help with this problem?

Provide an answer of your own, or ask Seti for more information if necessary.

To post a message you must log in.