Ig2_Wall_Polyhedra_PolyhedraGeom (and other Polyhedra code ?) segfault
The script at the very below defines 10 Polyhedra
particles falling on a ground Wall
. While behavior (in sequential execution) is not fully reproducible, it ends very often (let say 9 times out of 10) in less than a minute with some segfault-like crash (message varies around Segmentation fault (core dumped)
) that comes from
Ig2_Wall_Polyhedra_PolyhedraGeom::go
- then, because of that, a
Polyhedron_Plane_intersection
function defined here - then, because of that, a
Simplify
function defined here - then, some CGAL
*Halfedge*
function
For convenience, here are first some terminal commands to automatically execute the script after downloading vertices coordinates from the internet:
mkdir test && cd test
wget https://nextcloud.inrae.fr/s/Ca5aXq8jx7Py2Xa/download/ig2wallpoly.tar # vertices data file and yade script
tar xvf ig2wallpoly.tar && rm ig2wallpoly.tar
yadedaily ig2wallpoly.py # or yade
And finally, that ig2wallpoly.py
that crashes with yade versions spanning from yade # 2018.02b
to yadedaily # 20210703-5497~a37d9fd~focal1
and CGAL 4.11 to 5.02
Having confirmation (in addition to @schd, thank you Sacha) of the crash would already be something.
# falling polyhedral particles (10 of them) that shows a crash coming from Ig2_Wall_Polyhedra_PolyhedraGeom
#################################
### An initial handy function ###
#################################
def read3colTxtFile(fileObj,header=0):
'''Reads a 3 columns text file with numeric data, e.g. a list of points in 3D space.
:param fileObj: the file object such as returned by open(path,'r')
:param header: how many header lines there is (and you do not want to read)
:returns: a list (of 3 elements list) of points
'''
wholeFile = fileObj.read()
lines = wholeFile.splitlines()[header:]
lPts=[]
for line in lines:
strPt = line.split()
lPts.append([float(strPt[i]) for i in range(3)])
return lPts
#########################
### Engine definition ###
#########################
O.engines=[ForceResetter()
,InsertionSortCollider([Bo1_Polyhedra_Aabb(),Bo1_Wall_Aabb()],verletDist = 0)
,InteractionLoop(
[Ig2_Polyhedra_Polyhedra_PolyhedraGeom(),Ig2_Wall_Polyhedra_PolyhedraGeom()],
[Ip2_PolyhedraMat_PolyhedraMat_PolyhedraPhys()],
[Law2_PolyhedraGeom_PolyhedraPhys_Volumetric(volumePower=1./3.)]
)
,NewtonIntegrator(damping=0.3,label='newton',gravity = (0,0,-9.8))
]
O.dt = 25*1.e-6
#########################
### Bodies definition ###
#########################
O.materials.append(PolyhedraMat(density=2650,frictionAngle=radians(25),young=2.e5,poisson=0.7))
for cpt in range(10): # defining 10 polyhedra that will fall
O.bodies.append(polyhedron(read3colTxtFile(open('vertBod'+str(cpt)+'.txt'),header=1)))
O.bodies.append(wall( (0,0,0),2,sense=1 )) # a frictional ground wall
################
### Let s go ###
################
O.save('ini.yade')
yade.qt.Controller(),yade.qt.View()
O.run(70000) # crash (e.g. segmentation fault, frozen Controller and terminal) usually happens before