New question #293295 on Yade: https://answers.launchpad.net/yade/+question/293295
Hello everyone, Here is a description of the problem I am trying to solve: -- I have a granular sample with spherical particles of diameters D1, D2, D3 etc. All of such big particles (lets call them agglomerates) are composed of smaller particles of diameter 'd', since d is the smallest particle size of interest. -- Initially, within each big spherical particle, all the smaller particles should be densely packed and connected with cohesive bonds (CohFrictMat). As the loading is applied, the initially defined cohesive bonds within each big sphere will break progressively leading to smaller fragments. Now, the problem I am facing: Initially, within a single big sphere itself, sometimes there are particles which are shown not to have any cohesive interaction, leaving the small individual particle free to fly. How can I alleviate this problem ? This is a follow-up question to https://answers.launchpad.net/yade/+question/292846 Here is the script: from yade import pack ############################################################################# # Set up run ############################################################################# run_name="PeriodicCohesive_MWE" data_root_dir="." ############################################################################# # Materials ############################################################################# plate_material=FrictMat( young=200e9 ,poisson=0.3 ,density=8000. ,frictionAngle=radians(30) ,label='plate_mat') O.materials.append(plate_material) sample_material=CohFrictMat( young=4e9 ,poisson=0.25 ,density=1400 ,frictionAngle=radians(30) ,normalCohesion=1e8*1.2 ,shearCohesion=.4e8*1.2 ,momentRotationLaw=True ,label='sample_mat') O.materials.append(sample_material) ############################################################################# # Component dimensions and operating condition ############################################################################# # Granular material dimension sample_diameter=2e-4 #sample_diameter=126e-6 sample_radius=sample_diameter/2.0 # Sub-particle dimension particle_diameter=74e-6 particle_radius=particle_diameter/2. ############################################################################# # grinding plate dimension ############################################################################# rotvel=2./3.*pi*(1.5+0.5)*.254 ############################################################################# # Periodic Geometry ############################################################################# # Set up periodic boundary conditions O.periodic=True xExt=4*sample_diameter yExt=3.*sample_diameter*2 #to block the periodicity in y direction zExt=xExt xLim=xExt yLim=yExt/4 zLim=zExt O.cell.hSize=Matrix3( xExt, 0, 0, 0, yExt, 0, 0, 0, zExt) length=xExt height=yExt width=zExt # Top and bottom plate thickness thickness=0.1*height bottomBoxes = [] for ix in (0,1,2): for iz in (0,1,2): bottomBoxes.append(box( # create 3x3 boxes with 1/3 cell size center=(xExt/6.*(1+2*ix),yLim - thickness/2.0,zExt/6.*(1+2*iz)) ,extents=(xExt/6.,thickness/2.0,zExt/6.) ,wire=False ,material='plate_mat' )) bottom_id,bottom_ids = O.bodies.appendClumped(bottomBoxes) # bottom_id is the clump id, O.bodies[bottom_id].state.blockedDOFs='xyzXYZ' ############################################################################# # Particle Packing ############################################################################# min_corner= (0,yLim,0) max_corner= (xLim, yExt-yLim, zLim) sp=pack.SpherePack() sp.makeCloud( min_corner,max_corner, rMean=sample_radius, periodic=False, seed=1) print "Generated ",len(sp)," aggregates" ########################################### # Sample ########################################### for s in sp: sphere=pack.inSphere((s[0][0],s[0][1],s[0][2]),s[1]) sp1=pack.randomDensePack( sphere ,spheresInCell=2000 ,radius=particle_radius ,memoizeDb='/tmp/triaxPackCache.sqlite' ,returnSpherePack=True ) sp1.toSimulation(material='sample_mat',color=(0.9,0.8,0.6)) print 'Generated ',len(sp1),' particles' Gl1_Sphere(stripes=True) ######### # Top ######### topBoxes = [] for ix in (0,1,2): for iz in (0,1,2): topBoxes.append(box( # create 3x3 boxes with 1/3 cell size center=(xExt/6.*(1+2*ix),yExt - yLim + thickness/2.0,zExt/6.*(1+2*iz)) ,extents=(xExt/6.,thickness/2.0,zExt/6.) ,wire=False ,material='plate_mat' )) top_id,top_ids = O.bodies.appendClumped(topBoxes) # top_id is the clump id, O.bodies[top_id].state.blockedDOFs='xzXYZ' plate_downforce=-0.036 O.forces.addF(top_id,(0,plate_downforce,0),permanent=True) O.bodies[top_id].state.vel[0]= rotvel ############################################################################# # Run the simulation ############################################################################# r_int = 1.0 # interaction radius O.dt=0.5*PWaveTimeStep() O.engines=[ ForceResetter(), InsertionSortCollider([ Bo1_Sphere_Aabb(aabbEnlargeFactor=r_int, label='bo1s') ,Bo1_Box_Aabb() ], allowBiggerThanPeriod=True ), InteractionLoop( [Ig2_Sphere_Sphere_ScGeom6D(interactionDetectionFactor=r_int, label='ig2ss') ,Ig2_Box_Sphere_ScGeom6D() ], [Ip2_FrictMat_FrictMat_FrictPhys() ,Ip2_CohFrictMat_CohFrictMat_CohFrictPhys(setCohesionNow=True,label="cohesiveIp") ], [Law2_ScGeom_FrictPhys_CundallStrack() ,Law2_ScGeom6D_CohFrictPhys_CohesionMoment() ] ), # End InteractionLoop NewtonIntegrator(damping=0.8,gravity=(0.,0.,0.)), ] O.step() def addBodyToAggreg(body,aggreg): # auxiliary function, add body [yade.Body instance] and all its neighbors into aggreg (python set instance) if body.id in aggreg: # do nothing if b is already in aggreg ... return aggreg.add(body.id) # ... otherwise add it to aggreg intrs = body.intrs() for i in intrs: # and add also all its neighbors ... if not isinstance(i.phys,CohFrictPhys): # ... but only that connected with CohFrictPhys interactions continue if i.phys.cohesionBroken: # ... but only not yet broken continue # if not i.isReal: # continue i2 = i.id1 if i.id2==body.id else i.id2 # choose the other body of interaction b2 = O.bodies[i2] addBodyToAggreg(b2,aggreg) # and add it and all its neighbors to aggreg def aggregs(): # actual function to detect standalone aggregates ids = set(b.id for b in O.bodies if isinstance(b.shape,Sphere)) # first make a set of all spheres ids ret = [] while len(ids)>0: # while there are still some particles not assigned to any aggregate ... i = ids.pop() # ... choose one random ... b = O.bodies[i] a = set() # ... create new aggregate (set of sphere ids) addBodyToAggreg(b,a) # ... and add the sphere together with all its neigbors to aggregate for bid in a: # delete all used ids from ids ids.discard(bid) ret.append(a) return ret aggs = aggregs() for a in aggs: print a I would really appreciate your help. Thanks Varun You received this question notification because your team yade-users is an answer contact for Yade. _______________________________________________ Mailing list: https://launchpad.net/~yade-users Post to : [email protected] Unsubscribe : https://launchpad.net/~yade-users More help : https://help.launchpad.net/ListHelp

