silulation can not quit

Asked by lip

hello
i was going to do creat a boundary consist of many walls, the particles deposited by gravity within the boundary, and then i want to remove one of the wall to destabilize the accumulation and let the particles flow along a chute. But i put the code which remove the wall in the checkUnbalance function and make the simulation can not quit, i do not know where to put the code to let the simulation quit. Below is my code:

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(10, axis=0, sense=-1, material=m))
O.bodies.append(utils.wall(0, axis=0, sense=1, material=m))
O.bodies.append(utils.wall(10, 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),(10,10,10),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.pause()
      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

Question information

Language:
English Edit question
Status:
Answered
For:
Yade Edit question
Assignee:
No assignee Edit question
Last query:
Last reply:
Revision history for this message
Jan Stránský (honzik) said :
#1

Hello,
O.run() [2] just runs.. To stop, you have several options:

1) call O.pause() manually [1]

2) run specific number of time steps "hardcoded" in O.run [2]
O.run(1000) or O.run(1000,True)

3) use O.stopAt*[3,4]
O.stopAtIter = 1000
O.run()

4) use another function in PyRunner and call O.pause (similar to what you do in checkUnbalanced):
###
def checkStopCondition():
   if yourConditionToStop:
      O.pause()
...
O.engines = [
   ...
   PyRunner(iterPeriod=1000,command="checkStopCondition()")
###

cheers
Jan

[1] https://yade-dem.org/doc/yade.wrapper.html#yade.wrapper.Omega.pause
[2] https://yade-dem.org/doc/yade.wrapper.html#yade.wrapper.Omega.run
[3] https://yade-dem.org/doc/yade.wrapper.html#yade.wrapper.Omega.stopAtIter
[4] https://yade-dem.org/doc/yade.wrapper.html#yade.wrapper.Omega.stopAtTime

Can you help with this problem?

Provide an answer of your own, or ask lip for more information if necessary.

To post a message you must log in.