yade-users team mailing list archive
-
yade-users team
-
Mailing list archive
-
Message #15006
Re: [Question #635871]: Bonded Particle Model using JCFpmMat
Question #635871 on Yade changed:
https://answers.launchpad.net/yade/+question/635871
Status: Open => Answered
Luc Scholtès proposed the following answer:
Hi Xavier,
yes, you are right, the contact bond model is irrelevant with respect to
bending or twisting resistance. These features are available in:
https://yade-
dem.org/doc/yade.wrapper.html#yade.wrapper.Law2_ScGeom6D_CohFrictPhys_CohesionMoment.
However, I suggest you have a look at the reference mentioned by Jerome
about JCFPM (Scholtes et al, JMPS, 2013) where there is a justification
for using the JCFPM contact bond model for rock like materials under the
condition that you use its near neighbour interaction feature (to create
bonds between non touching particles). It provides a simple but
nonetheless efficient method to reproduce high ratios of tensile to
compressive strength that even the parallel bond model is not able to
reproduce (this limitation of the classic BPMs, either contact or
parallel bond models, has been largely discussed in the literature and
new bond models have even been proposed).
Regarding your second question, yes, it is possible to identify clusters
of bonded particles with the JCFPM. The principle is actually quite
simple and some basic programming skills can do the job. You have to
loop over bodies and count, for each one, if they share bonds with
others. The difficulty is to make sure you do not count the same
particle several times. Please find below a workaround I used several
years ago to (this might need to be updated and can certainly be
optimized).
Cheers
Luc
outFile=open(O.tags['id']+'_Distribution.spheres','a')
outFile.write('# Id_nbPart_X_Y_Z_V' + '\n')
for o in O.bodies :
if isinstance(o.shape,Sphere) and o.dynamic==True :
del particles[:]
color=[random.random(),random.random(),random.random()]
nbFragments+=1
print 'fragment ID=', nbFragments
particles.append(o.id)
o.dynamic=False # mark particles to avoid multiple counting (dynamic attribute is used arbitrarily for that)
o.shape.color=color
for c in particles :
for i in O.interactions.withBody(c) :
if i.phys.isCohesive :
if i.id1==c and O.bodies[i.id2].dynamic==True :
particles.append(i.id2)
O.bodies[i.id2].dynamic=False
O.bodies[i.id2].shape.color=color
#print 'i.id2=', i.id2
elif i.id2==c and O.bodies[i.id1].dynamic==True :
particles.append(i.id1)
O.bodies[i.id1].dynamic=False
O.bodies[i.id1].shape.color=color
#print 'i.id1=', i.id2
xmin=ymin=zmin=1000
xmax=ymax=zmax=0
nbParticles=X=Y=Z=V=0
for p in particles :
nbParticles+=1
V+=1.333*3.14*pow(O.bodies[p].shape.radius,3)
if O.bodies[p].state.pos[0]<xmin :
xmin=O.bodies[p].state.pos[0]-O.bodies[p].shape.radius
if O.bodies[p].state.pos[0]>xmax :
xmax=O.bodies[p].state.pos[0]+O.bodies[p].shape.radius
if O.bodies[p].state.pos[1]<ymin :
ymin=O.bodies[p].state.pos[1]-O.bodies[p].shape.radius
if O.bodies[p].state.pos[1]>ymax :
ymax=O.bodies[p].state.pos[1]+O.bodies[p].shape.radius
if O.bodies[p].state.pos[2]<zmin :
zmin=O.bodies[p].state.pos[2]-O.bodies[p].shape.radius
if O.bodies[p].state.pos[2]>zmax :
zmax=O.bodies[p].state.pos[2]+O.bodies[p].shape.radius
X=xmax-xmin
Y=ymax-ymin
Z=zmax-zmin
outFile.write('%g\t%g\t%g\t%g\t%g\t%g\n'%(nbFragments,nbParticles,X,Y,Z,V))
print 'nbFragments=', nbFragments
outFile.close()
--
You received this question notification because your team yade-users is
an answer contact for Yade.