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

Reply via email to