local region particle number

Asked by nobody on 2020-04-13

hi all,

I want to get the local variables, something like the local stress for a specific region.
my idea is to set a local region and then under that condition, I can calculate these variables.

my first step is to set a local region, I think this is very easy. see the code below.
however, when I count the number of particles in this region, the number by using the code is not the same as shown in the 3D plot.
here is the code.
#####################
from yade import pack, plot, export
O.bodies.append(geom.facetBox((.5,.5,.5),(.5,.5,.5),wallMask=31))
sp=pack.SpherePack()
sp.makeCloud((0,0,0),(1,1,1),rMean=.08,rRelFuzz=.5)
sp.toSimulation()
O.engines=[
    ForceResetter(),
    InsertionSortCollider([Bo1_Sphere_Aabb(),Bo1_Facet_Aabb()]),
    InteractionLoop(
        [Ig2_Sphere_Sphere_ScGeom(),Ig2_Facet_Sphere_ScGeom()],
        [Ip2_FrictMat_FrictMat_FrictPhys()],
        [Law2_ScGeom_FrictPhys_CundallStrack()]),
    PyRunner(command='checkUnbalanced()',realPeriod=2),
    #PyRunner(command='addPlotData()',iterPeriod=100),
    PyRunner(command='subbox()',iterPeriod=100),
    #PyRunner(command='stress_export()',iterPeriod=100),
    NewtonIntegrator(gravity=(0,0,-9.81),damping=0.4),
]
O.dt=.5*PWaveTimeStep()
print(len(O.bodies))
def checkUnbalanced():
    if unbalancedForce()<.05:
     O.pause()
######################## sub-region and coloring#########################
ball_list1 =[]
ball_list2 =[]
ball_list3 =[]
def subbox():
 global ball_list1
 global ball_list2
 global ball_list3
 for b in O.bodies:
  if 0< b.state.pos[2] <= 0.15:
   if isinstance(b.shape,Sphere):
    b.shape.color =Vector3(255,255,255) # white
    m = b.id
    ball_list1.append(m)
  elif 0.15 < b.state.pos[2] <= 0.3:
   if isinstance(b.shape,Sphere):
    b.shape.color =Vector3(0,100,000) # green
    n = b.id
    ball_list2.append(n)
  elif b.state.pos[2] > 0.3:
   if isinstance(b.shape,Sphere):
    b.shape.color =Vector3(00,00,255) # blue
    q = b.id
    ball_list3.append(q)
    print("this is the number in region 3:",len(ball_list3))
######################## sub-region and coloring############################
I divide the particles into three regions. as you can see, region three is the upper layer. if we count the number in this region, theere are about 20 particles. however, if we use the print function, this number is about 4500.
I think this may relate to the global or local variable of the " global ball_list3". but right now I haven't figure out how to solve this problem.

thanks!
Yong

Question information

Language:
English Edit question
Status:
Solved
For:
Yade Edit question
Assignee:
No assignee Edit question
Solved by:
Jan Stránský
Solved:
2020-04-16
Last query:
2020-04-16
Last reply:
2020-04-14
Best Jan Stránský (honzik) said : #1

Hello,

if you call subbox several time, you append to already existing list. One solution is to reset the list before "for b in O.bodies" loop:
###
def subbox():
 global ball_list1
 ball_list1 = []
 ...
###

cheers
Jan

nobody (nobody01) said : #2

hi Jan,

thanks! I will try it.

best,
Yong

nobody (nobody01) said : #3

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