particles partially in the wall

Asked by JOHN

Good evening,
I run a very simple simulation with default material. As it turns out, some of the particles find themselves partially inside the walls after some iterations. This is to be expected of a DEM method, but they can exit on their own. Is there a way to fix this?
I would expect the forces produced by the wall sphere interaction to be strong enough to take every particle out by the time the system rests.

Thank you very much for any help.
Best Regards
John

PS the simulation is really simple, just an exit taken from the example and a function to calculate a new gravity vector when the system rests.

Question information

Language:
English Edit question
Status:
Solved
For:
Yade Edit question
Assignee:
No assignee Edit question
Solved by:
Jan Stránský
Solved:
Last query:
Last reply:

This question was reopened

  • by JOHN
Revision history for this message
Jan Stránský (honzik) said :
#1

Hi John,
please provide a MWE. E.g., the used time step could affect this
thanks
Jan

Revision history for this message
JOHN (washingmachine) said :
#2

Hello,
the used timestep is
  O.dt=.8*PWaveTimeStep()
and the initialization deletes all the particles that are initially partly or fully inside the walls

Revision history for this message
JOHN (washingmachine) said :
#3

minimal working example follows

def run(name,boundaries,r,gap,numStepsPerIteration):

  facets = ymport.stl(name)

  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)

   sp=pack.regularHexa(pack.inAlignedBox((boundaries[0],boundaries[2],boundaries[4]),(boundaries[1],boundaries[3],boundaries[5])),radius=r,gap=gap)

  # remove spheres completely inside walls

  for b in sp:

     if pred(b.state.pos,0):

        continue

     O.bodies.append(b)

  # 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

  if not restart:

   for b in toErase: # delete the spheres

      O.bodies.erase(b.id)

  #generate the initial global index list

  for b in O.bodies:

      if isinstance(b.shape,Sphere):

   loc2glob.append(b.id)

  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, label='newtonInt'),

  ]

  O.dt=.8*PWaveTimeStep()

  O.step()

Revision history for this message
JOHN (washingmachine) said :
#4

minimal working example follows

def run(name,boundaries,r,gap,numStepsPerIteration):

  facets = ymport.stl(name)

  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)

   sp=pack.regularHexa(pack.inAlignedBox((boundaries[0],boundaries[2],boundaries[4]),(boundaries[1],boundaries[3],boundaries[5])),radius=r,gap=gap)

  # remove spheres completely inside walls

  for b in sp:

     if pred(b.state.pos,0):

        continue

     O.bodies.append(b)

  # 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

  if not restart:

   for b in toErase: # delete the spheres

      O.bodies.erase(b.id)

  #generate the initial global index list

  for b in O.bodies:

      if isinstance(b.shape,Sphere):

   loc2glob.append(b.id)

  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, label='newtonInt'),

  ]

  O.dt=.8*PWaveTimeStep()

  O.step()

Revision history for this message
Jan Stránský (honzik) said :
#5

Please also provide the stl file
thanks
Jan

Revision history for this message
JOHN (washingmachine) said :
#6

http://dropmefiles.com/zwMDt

But the issue appears almost randomly after some rotations.

Revision history for this message
Jan Stránský (honzik) said :
#7

thanks for the file. Now please make the example working :-D i.e. with what arguments do you call run(...)?
thx
Jan

Revision history for this message
JOHN (washingmachine) said :
#8

boundaries = [-75.0, 75.4, -75.013, 75.387, 0.0, 15.200000000000001]

 Yadesimulation.run("maze1.stl",boundaries2,0,100)

So the problem is, this will propably not show the error. The thing that causes it ironically i dont have the right to give.
I was hoping more on a general method on how to extract particles from the wall the fastest with the least amount of unphysical behaviour possible for a general case

I appreciate the difficulty of the question and i really appreciate your help so far

Revision history for this message
Best Jan Stránský (honzik) said :
#9

Hi John,

please really try to make the example be working, i.e. try to run it yourself. There are too many undefined variables (e.g. restart could be tested True or False, but loc2glob is missing completely..)

To prevent particles go through walls, you can try:
- increase stiffness of walls or both walls and particles
- decrease time step (if your problem is not in stable regime)

cheers
Jan

Revision history for this message
JOHN (washingmachine) said :
#10

Thanks for that, wall stiffness helped considerable
regards
John

Revision history for this message
JOHN (washingmachine) said :
#11

Thanks Jan Stránský, that solved my question.