← Back to team overview

yade-users team mailing list archive

[Question #678558]: principle of contact detection about polyhedra

 

New question #678558 on Yade:
https://answers.launchpad.net/yade/+question/678558

hello
i create many polyhedra to make them collison with each ohter, but when the numble of particles reach to 2000, the simulation become very slow. my computer have 64 cores ,the cpu is Xeon, 2.4Hz,i want to know the principle of the  contact detection  between polyhedra to find out how can i improve the performance. my code is as below:
from yade import polyhedra_utils,pack,plot
import random

m = PolyhedraMat()
m.density = 2600  # kg/m^3
m.young = 1E6  # Pa
m.poisson = 20000 / 1E6
m.frictionAngle = 0.6  # rad

O.bodies.append(utils.wall(-1, axis=2, sense=1, material=m))
O.bodies.append(utils.wall(20, axis=0, sense=-1, material=m))
O.bodies.append(utils.wall(0, axis=0, sense=1, material=m))
O.bodies.append(utils.wall(20, axis=1, sense=-1, material=m))
O.bodies.append(utils.wall(0, axis=1, sense=1, material=m))
# generate randomly spheres with uniform radius distribution
polyhedra_utils.fillBox((0,0,0),(20,20,20),m,seed=1)

O.engines = [
    ForceResetter(),
    InsertionSortCollider([Bo1_Polyhedra_Aabb(), Bo1_Wall_Aabb(), Bo1_Facet_Aabb()]),
    InteractionLoop(
        [Ig2_Wall_Polyhedra_PolyhedraGeom(), Ig2_Polyhedra_Polyhedra_PolyhedraGeom(),
         Ig2_Facet_Polyhedra_PolyhedraGeom()],
        [Ip2_PolyhedraMat_PolyhedraMat_PolyhedraPhys()],  # collision "physics"
        [Law2_PolyhedraGeom_PolyhedraPhys_Volumetric()]  # contact law -- apply forces
    ),
    # GravityEngine(gravity=(0,0,-9.81)),
    NewtonIntegrator(damping=0.5, gravity=(0, 0, -9.81)),
    PyRunner(command='checkUnbalanced()', realPeriod=3, label='checker')
]
O.dt=1e-2

# enable energy tracking; any simulation parts supporting it
# can create and update arbitrary energy types, which can be
# accessed as O.energy['energyName'] subsequently
O.trackEnergy=True
# if the unbalanced forces goes below .05, the packing
# is considered stabilized, therefore we stop collected
# data history and stop
def checkUnbalanced():
   if unbalancedForce()<.05:
      O.bodies.erase(1)
      O.run()
      #plot.saveDataTxt('bbb.txt.bz2')
      # plot.saveGnuplot('bbb') is also possible

# collect history of data which will be plotted
def addPlotData():
   # each item is given a names, by which it can be the unsed in plot.plots
   # the **O.energy converts dictionary-like O.energy to plot.addData arguments
   plot.addData(i=O.iter,unbalanced=unbalancedForce(),**O.energy)

# define how to plot data: 'i' (step number) on the x-axis, unbalanced force
# on the left y-axis, all energies on the right y-axis
# (O.energy.keys is function which will be called to get all defined energies)
# None separates left and right y-axis
plot.plots={'i':('unbalanced',None,O.energy.keys)}

# show the plot on the screen, and update while the simulation runs
plot.plot()

O.saveTmp()

i would appreciate it if you can help me

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