← Back to team overview

yade-users team mailing list archive

[Question #293295]: Want to connect all the particles in an aggregate using cohesive bond

 

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.