Hi everyone,

I am modelling a sand_pipe interaction problem, and I put my sample in a rigid container with periodic boundaries on the front and the back side. The problem is that some particles will cross rigid boundaries (not real rigid, fixed boxes are used), while the interaction between spheres and pipe (cylinderConnection) is fine. Same issue I find from the Bruno's example 'PeriodicSandPile.py' (https://gitlab.com/yade-dev/trunk/blob/master/examples/PeriodicBoundaries/periodicSandPile.py). Besides, I have not observed particles crossing the rigid boundary when the width of box is smaller than width of the periodic cell and no such issue occurs if the scene is not periodic. In my example, allowBiggerThanPeriod=True; boxes , cylinder and periodic cell have the same dimensions in the cylinder diameter direction. Can anyone give me some ideas about how to fix this issue?

related old questions: https://answers.launchpad.net/yade/+question/246392

related bugs: https://bugs.launchpad.net/yade/+bug/1112763

yade version: yade 20220218-6333~d331682~focal1

system: Ubuntu 20.04.3 LTS

My simplified example as below:

# encoding: utf-8

from yade import pack, qt

from yade import polyhedra_utils

from yade.gridpfacet import *

E=1e8

v=0.3

angle=30

beta=0.5

eta=0.5

rho=2650

O.engines=[

ForceResetter(),

InsertionSortCollider([Bo1_Sphere_Aabb(),Bo1_Box_Aabb(),Bo1_GridConnection_Aabb()],allowBiggerThanPeriod=True),

InteractionLoop(

[Ig2_Sphere_Sphere_ScGeom6D(),Ig2_Box_Sphere_ScGeom6D(),

Ig2_GridNode_GridNode_GridNodeGeom6D(),

Ig2_Sphere_GridConnection_ScGridCoGeom(),

Ig2_GridConnection_GridConnection_GridCoGridCoGeom()

],

[Ip2_FrictMat_FrictMat_FrictPhys(),

Ip2_CohFrictMat_CohFrictMat_CohFrictPhys(setCohesionNow=True, setCohesionOnNewContacts=False)],

[Law2_ScGridCoGeom_CohFrictPhys_CundallStrack(),

Law2_GridCoGridCoGeom_FrictPhys_CundallStrack(),

#Law2_ScGeom_FrictPhys_CundallStrack(),

Law2_ScGeom6D_CohFrictPhys_CohesionMoment(

always_use_moment_law=True,

useIncrementalForm=True

)],

),

GlobalStiffnessTimeStepper(timestepSafetyCoefficient=0.2),

NewtonIntegrator(gravity=(0,0,-9.81),damping=0.2),

]

spMat = O.materials.append(CohFrictMat(young=E,poisson=v,frictionAngle=radians(angle),density=rho,isCohesive=False,alphaKr=beta,alphaKtw=beta,momentRotationLaw=True,etaRoll=eta,etaTwist=eta))

wallMat = O.materials.append(CohFrictMat(young=E,poisson=v,frictionAngle=radians(0),density=rho,isCohesive=False,alphaKr=0,alphaKtw=0,momentRotationLaw=False,etaRoll=0,etaTwist=0))

extcylMat = O.materials.append(CohFrictMat(young=E,poisson=v,frictionAngle=radians(0),density=rho,isCohesive=False,alphaKr=beta,alphaKtw=beta,momentRotationLaw=True,etaRoll=eta,etaTwist=eta))

intcylMat = O.materials.append(CohFrictMat(young=E,poisson=v,frictionAngle=radians(0),density=rho,normalCohesion=-1,shearCohesion=-1,momentRotationLaw=True))

O.periodic = True

x=0.01

y=0.02

z=0.02

O.cell.setBox(x,y*3,z*3)

sp=pack.SpherePack()

mn,mx=Vector3(0,y,z+0.006),Vector3(x,y*2,z*2)

sp.makeCloud(mn,mx,rMean=.001,rRelFuzz=0,seed=1)

sphereIds=sp.toSimulation(material=spMat)

print(len(sp))

left_wall=O.bodies.append(utils.box((x/2,y,z*1.5),(x/2,0,z/2),wire=True,fixed=True,color=[1,0,0],material=wallMat))

right_wall=O.bodies.append(utils.box((x/2,y*2,z*1.5),(x/2,0,z/2),wire=True,fixed=True,color=[1,0,0],material=wallMat))

bottom_wall=O.bodies.append(utils.box((x/2,y*1.5,z),(x/2,y/2,0),wire=True,fixed=True,color=[1,0,0],material=wallMat))

#front_wall=O.bodies.append(utils.box((x,y*1.5,z*1.5),(0,y/2,z/2),wire=True,fixed=True,color=[1,0,0],material=wallMat))

#behind_wall=O.bodies.append(utils.box((0,y*1.5,z*1.5),(0,y/2,z/2),wire=True,fixed=True,color=[1,0,0],material=wallMat))

D=0.005

nodesIds=[]

cylIds=[]

vertices=[]

vertices.append([0,y*1.5,z+0.6*D])

vertices.append([x/5,y*1.5,z+0.6*D])

vertices.append([x*2/5,y*1.5,z+0.6*D])

vertices.append([x*3/5,y*1.5,z+0.6*D])

vertices.append([x*4/5,y*1.5,z+0.6*D])

vertices.append([x,y*1.5,z+0.6*D])

cylinderConnection(vertices,radius=0.5*D,fixed = True,nodesIds=nodesIds, cylIds=cylIds, intMaterial=intcylMat, extMaterial=extcylMat)

qt.View()

O.saveTmp()