Polyhedra contact instability (potential Bug?)
Dear Yade Users,
During the simulation of polyhedra deposition in the box, I encountered instability problems (even for small increments, some grains behave like popcorn). I have made some animations to observe this and came up with the conclusion that it may be related to switching the contact conditions. I have read the paper of Eliáš (which is full of clever ideas by the way), and I think that the issue may be the calculation of the direction of the normal force.
I conducted a simulation (see the script at the bottom of the post) that seems to confirm that hypothesis. I have two polyhedra, a cube and a prism (half of the cube) that are shifted. I slide one polyhedron to make a contact starting from one side of the cube. As I move the polyhedron, the intersection becomes symmetrical, and later it is "closer" to the other (perpendicular) wall. I would expect the forces to change gradually, but there is a sudden switch between vertical and horizontal forces.
Everything below is speculation since I am not a C++ developer.
I have found the part of the code responsible for normal force calculation (function FindNormal in [2]). It utilizes a function, that has a known flaw [3], so it is a possible suspect for me.
I wish, I could be able to verify this by myself, but it is not my league (yet ;) ). I am a more Python person.
[1] Eliáš, J. (2014). Simulation of railway ballast using crushable polyhedral particles. Powder Technology, 264, 458-465.
[2] https:/
[3] https:/
-------
# Yade version 2020.01a on Ubuntu 20.04
from yade import polyhedra_utils
from yade import plot
from yade import qt
#######
d = 0.1
#######
def addPlotData():
f0 = O.forces.f(0)[0]
f1 = O.forces.f(0)[1]
f2 = O.forces.f(0)[2]
t0 = O.forces.t(0)[0]
t1 = O.forces.t(0)[1]
t2 = O.forces.t(0)[2]
plot.addData(
#######
polyMat = PolyhedraMat()
#######
p1 = polyhedra_
p1.state.pos = (0,0,0)
p2 = polyhedra_
p2.state.pos = (0,0.9*d,d)
O.bodies.
#######
O.engines=[
ForceResetter(),
InsertionSor
InteractionLoop(
[
[
[
),
NewtonIntegr
PyRunner(
]
O.dt= 0.001*polyhedra
plot.plots=
plot.plot(subPlots =False)
try:
from yade import qt
qt.Controller()
v = qt.View()
v.ortho = True
v.viewDir = (-1,0,0)
v.showEntireSc
except:
pass
p2.state.vel = (0,0,-1)
O.run(20000)
Question information
- Language:
- English Edit question
- Status:
- Answered
- For:
- Yade Edit question
- Assignee:
- No assignee Edit question
- Last query:
- Last reply:
Can you help with this problem?
Provide an answer of your own, or ask Karol Brzezinski for more information if necessary.