← Back to team overview

yade-users team mailing list archive

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.