from yade import pack,plot readParamsFromTable(useL3Geom=True,nonviscDamp=0,frictAngle=0,useClumps=False,noTableOk=True) from yade.params import table if 1: sp=pack.SpherePack(); # bunch of balls, with an infinite plane just underneath if not table.useClumps: sp.makeCloud((0,0,0),(1,1,1),.05,.5); # use clumps of 2 spheres instead, to have rotation without friction else: sp.makeClumpCloud((0,0,0),(1,1,1),[pack.SpherePack([((0,0,0),.05),((0,0,.08),.02)])],periodic=False) sp.toSimulation() else: O.bodies.append(sphere((0,0,2),radius=.5)) # one single bouncing ball O.bodies.append(wall(position=0,axis=2,sense=1)) O.engines=[ ForceResetter(), InsertionSortCollider([Bo1_Sphere_Aabb(),Bo1_Wall_Aabb()]), InteractionLoop([Ig2_Sphere_Sphere_L3Geom(approxMask=0),Ig2_Wall_Sphere_L3Geom(approxMask=0)],[Ip2_FrictMat_FrictMat_FrictPhys(frictAngle=table.frictAngle)],[Law2_L3Geom_FrictPhys_ElPerfPl(noSlip=False,noBreak=False)]) if table.useL3Geom else InteractionLoop([Ig2_Sphere_Sphere_ScGeom(),Ig2_Wall_Sphere_ScGeom()],[Ip2_FrictMat_FrictMat_FrictPhys(frictAngle=table.frictAngle)],[Law2_ScGeom_FrictPhys_CundallStrack()]), NewtonIntegrator(damping=table.nonviscDamp,kinSplit=True,gravity=(0,0,-9.81)), PyRunner(iterPeriod=1,command='addPlotData()'), ] O.dt=.1*PWaveTimeStep() def addPlotData(): Ek,maxId=kineticEnergy(findMaxId=True) plot.addData(i=O.iter,total=O.energy.total(),maxId=maxId,**O.energy) # turn on energy tracking O.trackEnergy=True O.saveTmp() # the callable should return list of strings, plots will be updated automatically plot.plots={'i':[O.energy.keys,None,'total']} #from yade import timing #O.timingEnabled=True #timing.stats() plot.plot(subPlots=False)