← Back to team overview

yade-users team mailing list archive

Re: [Question #660522]: can walls be excluded from particles cloud creation?

 

Question #660522 on Yade changed:
https://answers.launchpad.net/yade/+question/660522

    Status: Needs information => Answered

Jan Stránský proposed the following answer:
Hi John,
try the following code. Also have a look at [1]. In case of any question or problem, let us know.
cheers
Jan

[1] https://answers.launchpad.net/yade/+question/406791

####
import gts
from yade.pack import *
from yade import ymport

facets = ymport.stl('maze.stl')
rod1 = O.bodies.append(facets)

# converts facets to gts (see the other question)
s = gts.Surface()
for facet in facets:
   vs = [facet.state.pos + facet.state.ori*v for v in facet.shape.vertices]
   vs = [gts.Vertex(v[0],v[1],v[2]) for v in vs]
   es = [gts.Edge(vs[i],vs[j]) for i,j in ((0,1),(1,2),(2,0))]
   f = gts.Face(es[0],es[1],es[2])
   s.add(f)
print s.is_closed()
threshold = 1e-3
s.cleanup(threshold)
print s.is_closed()
assert s.is_closed()

# use gts to filter spheres
pred = inGtsSurface(s)

O.engines=[
   ForceResetter(),
   InsertionSortCollider([Bo1_Sphere_Aabb(),Bo1_Facet_Aabb()]),
   InteractionLoop(
# handle sphere+sphere and facet+sphere collisions
      [Ig2_Sphere_Sphere_ScGeom(),Ig2_Facet_Sphere_ScGeom()],
      [Ip2_FrictMat_FrictMat_FrictPhys()],
      [Law2_ScGeom_FrictPhys_CundallStrack()]
   ),
   NewtonIntegrator(gravity=(0,-9.81,0),damping=0.4),
# call the checkUnbalanced function (defined below) every 2 seconds
]

sp=pack.SpherePack()
sp.makeCloud((0,0,3),(20,20,15),rMean=0.5)

# remove spheres completely inside walls
for c,r in sp:
   if pred(c,0):
      continue
   O.bodies.append(sphere(c,r))

# remove spheres partially inside walls
O.dt = 0
O.step() # interactions are created afterwards
toErase = set()
for i in O.interactions:
   b1,b2 = [O.bodies[i] for i in (i.id1,i.id2)]
   if any(isinstance(b.shape,Facet) for b in (b1,b2)): # if facet is involved, delete 
      toErase.add(b1)
      toErase.add(b2)
toErase = [b for b in toErase if isinstance(b.shape,Sphere)] # delete just spheres
for b in toErase: # delete the spheres
   O.bodies.erase(b.id)

O.dt=.5*PWaveTimeStep()
####

-- 
You received this question notification because your team yade-users is
an answer contact for Yade.