Adding friction on an inclined plane

Asked by dennis

Hi to all,

  I'm trying to simulate a granular collapse over an inclined plane. I used gmsh to create the inclined plane.
I'm wondering if it is possible to add frictional interaction on its surface when particles slide on it.

Thanks for any help.

Question information

Language:
English Edit question
Status:
Solved
For:
ESyS-Particle Edit question
Assignee:
No assignee Edit question
Solved by:
SteffenAbe
Solved:
Last query:
Last reply:
Revision history for this message
ceguo (hhh-guo) said :
#1

Hi dennis,

Try to glue particles on the mesh to mimic frictional surface. This is the only method in ESyS currently.

cheers,
Ning

Revision history for this message
dennis (dca1101) said :
#2

Hi Ning,

  Thanks for the reply. I guess I will use the NRotElasticTriMeshPrms module. Is this the correct module? I found an implementation in the hopper flow example in the esys-particle manual. I'm sorry for the late reply.

Sincerely,

Dennis

Revision history for this message
SteffenAbe (s-abe) said :
#3

Hi Dennis,

to glue particles to the mesh you'd need NRotBondedTriMeshPrms - not "Elastic".

Steffen

Revision history for this message
dennis (dca1101) said :
#4

Hi Steffen,

   Thanks for the reply and the correction. The parameters of NRotBondedTriMeshPrms are

    name (string)
    meshName (string)
    normalK (float)
    breakDistance (float)
    buildPrms (MeshTagBuildPrms or MeshGapBuildPrms)

    What is the correct value of the breakDistance? Or is there a default value? Is the code fragment below correct in
implementing the module?

   sim.createInteractionGroup (
        NRotBondedTriMeshPrms (
        name = "wall",
        meshName = "floor",
        normalK = 1.0000e+04
        breakDistance = ???
        buildPrms=MeshTagBuildPrms
    )
  )

 sim.createInteractionGroup (
        MeshTagBuildPrms (
        tag=1
        mask=-1
    )
  )

Sincerely,

Dennis

Revision history for this message
SteffenAbe (s-abe) said :
#5

Hi Dennis,

assuming that you don't want to break the particles away from the mesh a relatively large value of breakDistance would be advisable, i.e. something in the range of the particle diameter.
W.r.t. the MeshTagBuildPrms you'd need to make sure that the particles which you want to glue to the mesh are actually tagged "1" in your example. Otherwise the code looks fine.

I should have some examples sitting around - I'll dig them out and get back to you.

Steffen

Revision history for this message
dennis (dca1101) said :
#6

Hi Steffen,

   Seeing some examples would help a lot. Thanks for your help.

Sincerely,

Dennis

Revision history for this message
Best SteffenAbe (s-abe) said :
#7

Hi Dennis,

see blow for a gengeo script generating a box with some tagged particles along the bottom edge and a suitable mesh file.

The commands to build the bonded mesh interaction would be:

sim.readMesh("sbx.msh","Mesh1",0)
sim.readMesh("sbx.msh","Mesh2",1)
bip1=NRotBondedTriMeshPrms("meshbonded1","Mesh1",1.0,1.0,MeshTagBuildPrms(8,8))
bip2=NRotBondedTriMeshPrms("meshbonded2","Mesh2",1.0,1.0,MeshTagBuildPrms(4,4))
sim.createInteractionGroup(bip1)
sim.createInteractionGroup(bip2)

# ----------------------------------
from gengeo import *
import sys

# generate box filled with loose particles

xdim=20
ydim=10
zdim=10
rmin=0.2
rmax = 1.0

# corners
minPoint = Vector3(0.0,0.0,0.0)
maxPoint = Vector3(xdim,ydim,zdim)

# Define the volume to be filled with spheres:
box = BoxWithPlanes3D (
   minPoint = minPoint,
   maxPoint = maxPoint
)

# boundary planes
top_plane=Plane(maxPoint, Vector3(0.0,-1.0,0.0))
bottom_plane=Plane(minPoint, Vector3(0.0,1.0,0.0))

box.addPlane(Plane(minPoint,Vector3(1.0,0.0,0.0)))
box.addPlane(bottom_plane)
box.addPlane(Plane(minPoint, Vector3(0.0,0.0,1.0)))
box.addPlane(Plane(maxPoint, Vector3(-1.0,0.0,0.0)))
box.addPlane(top_plane)
box.addPlane(Plane(maxPoint, Vector3(0.0,0.0,-1.0)))

# neighbour table
mntable = MNTable3D (
   minPoint = minPoint,
   maxPoint = maxPoint,
   gridSize = 2.5*rmax,
   numGroups = 1
)

# Fill the volume with particles:
packer = InsertGenerator3D (
   minRadius = rmin,
   maxRadius = rmax,
   insertFails = 1000,
   maxIterations = 1000,
   tolerance = 1.0e-6,
   seed=42
)

packer.generatePacking(
   volume = box,
   ntable = mntable,
   groupID = 0,
   tag=0
   )

# tagging bottom
xmin=0.0
ymin=0.0
zmin=0.0
xmax=xdim
ymax=ydim
zmax=zdim

bottom_left=TriPatchSet()
bottom_left.addTriangle(minPoint,Vector3(xmin,ymin,zmax),Vector3((xmin+xmax)/2.0,ymin,zmax),0)
bottom_left.addTriangle(minPoint,Vector3((xmin+xmax)/2.0,ymin,zmin),Vector3((xmin+xmax)/2.0,ymin,zmax),0)

bottom_right=TriPatchSet()

bottom_right.addTriangle(Vector3(xmax,ymin,zmin),Vector3(xmax,ymin,zmax),Vector3((xmin+xmax)/2.0,ymin,zmax),0)
bottom_right.addTriangle(Vector3(xmax,ymin,zmin),Vector3((xmin+xmax)/2.0,ymin,zmin),Vector3((xmin+xmax)/2.0,ymin,zmax),0)

mntable.tagParticlesAlongJoints(bottom_left,0.5,8,8,0)
mntable.tagParticlesAlongJoints(bottom_right,0.5,4,-1,0)

# write a geometry file
mntable.write(
   fileName = "sbx3d.geo",
   outputStyle = 1
)

mntable.write(
   fileName = "sbx3d.vtu",
   outputStyle = 2
)

#--------------------------------------------
# sbx.msh below
#-------------------------------------------
3D-Nodes 18
0 0 0 0 15.0 0
1 1 0 0 0 0
2 2 0 10.0 0 0
3 3 0 20.0 -0.0 0
4 4 0 20.0 15.0 0
5 5 0 20.0 0 0
6 6 0 10.0 15.0 0
7 7 0 20.0 15.0 0
8 8 0 10.0 0 0
9 9 0 0 15.0 10.0
10 10 0 0 0 10.0
11 11 0 10.0 0 10.0
12 12 0 20.0 -0.0 10.0
13 13 0 20.0 15.0 10.0
14 14 0 20.0 0 10.0
15 15 0 10.0 15.0 10.0
16 16 0 20.0 15.0 10.0
17 17 0 10.0 0 10.0
Tri3 20
0 0 0 1 9
1 0 1 10 9
2 0 1 2 11
3 0 1 11 10
4 0 2 3 12
5 0 2 12 11
6 0 0 2 1
7 0 0 4 2
8 0 2 4 3
9 0 9 10 11
10 0 9 11 13
11 0 11 12 13
12 1 8 6 5
13 1 6 7 5
14 1 17 14 15
15 1 15 14 16
16 1 8 5 14
17 1 8 14 17
18 1 5 16 14
19 1 5 7 16

Revision history for this message
dennis (dca1101) said :
#8

Hi Steffen,

 Thanks for the example script. It really helps a lot.

dennis

Revision history for this message
dennis (dca1101) said :
#9

Thanks SteffenAbe, that solved my question.

Revision history for this message
Kahlil Fredrick Cui (physicsman98) said :
#10

HI!

This is a rather old thread, but I hope I can still add a question to this one which is somewhat related I think.

Is it possible to generate an inclined plane with particles already adhering to its surface at the start of the simulation? I want to simulate a landslide on an rough erodible incline which is why I need to them to hold on the plane under gravity while preserving the possibility of being eroded when it interacts with the landslide.

I have thought about this for a while now and I hope maybe you guys have an idea around this.
Thank you very much!

Revision history for this message
Dion Weatherley (d-weatherley) said :
#11

Hi Kahlil,

Using GenGeo you should be able to generate an initial particle geometry including a layer of particles tagged for bonding to a wall or trimesh. These particles should be bonded together with BrittleBeamPrms or similar as well. I'd set the cohesion of the bonded interactions relatively low so they will easily break during landslides.

I would probably use ConvexPolyhedron or MeshVolume in GenGeo to specify the dimensions of the erodible layer of particles.

Cheers,

Dion

Revision history for this message
Kahlil Fredrick Cui (physicsman98) said :
#12

Hello Dion,

I will try this out. I admit I haven't explored gengeo that much, only those in the tutorials.
Thank you very much!

Revision history for this message
Kahlil Fredrick Cui (physicsman98) said :
#13

Hello again!
I'd like to add a follow up question.
I already generated a inclined granular assembly using gengeo MeshVolume and also an un-bonded particle assembly using randomBoxPacker. However as the particles fall down towards the granular slope, they simply pass through. If I understand correctly, this is because there is no relationship set between the unbonded particles and the incline assembly. if so, how can I do this?

To explain my problem better, I have attached my code below:

#intializing
sim = LsmMpi(numWorkerProcesses = 1, mpiDimList = [1,1,1])
sim.initNeighborSearch(particleType = "RotSphere",
   gridSpacing = 1.29,
   verletDist = 0.04)

#setting temporal parameters
iterations = 100000
timeStep = 1e-04
interval = 1000

sim.setNumTimeSteps(iterations)
sim.setTimeStepSize(timeStep)

#setting spatial paramters
domain = BoundingBox(Vec3(0,0,0), Vec3(40,40,10))
sim.setSpatialDomain(domain, circDimList = [False, False, False])

#creating the mobile particle assembly
minradius = 0.2
maxradius = 0.5

moving = RandomBoxPacker(
 minRadius = minradius,
 maxRadius = maxradius,
 cubicPackRadius = 1.1,
 maxInsertFails = 1000,
 bBox = BoundingBox(Vec3(2,30,0), Vec3(7, 35, 10)),
 circDimList = [False, False, False],
 tolerance = 1.0e-5)

moving.generate()
moving_particles = moving.getSimpleSphereCollection()

for pp in moving_particles:
 pp.setTag = 0
 sim.createParticle(pp)

sim.setParticleDensity(tag = 0,
   mask = -1,
   Density = 2650)

#unbonded inter-particle interactions
sim.createInteractionGroup(FrictionPrms(
    name = "particle-contact",
    A = 1.0,
    youngsModulus = 100000.0,
    poissonsRatio = 0.25,
    dynamicMu = 0.4,
    staticMu = 0.6,
    damp = 0.1,
    cutoff = 0.0,
    rigid = True,
    meanR_scaling = True))

#=====================================================================================================
# generate box filled with loose particles using gengeo

#set the extent of the domain
minPoint = Vector3(0,0,0)
maxPoint = Vector3(32,30,10)
triMesh = TriPatchSet()

# read mesh file for list of points
with open('points.txt','r') as p:
 p_data = p.readlines()
 points = []
 for p_line in p_data:
  tri_point = p_line.split()
  tri_point = map(float, tri_point)
  #print (tri_point[3], tri_point[4], tri_point[5])
  vec_point = Vector3(tri_point[3], tri_point[4], tri_point[5])
  points.append(vec_point)

# read mesh file for list of triangles
with open('triangles.txt','r') as i:
 data = i.readlines()
 for line in data:
  cell = line.split()
  cell = map(int,cell)
  p1 = points[cell[2]]
  #print p1
  p2 = points[cell[3]]
  p3 = points[cell[4]]
  triMesh.addTriangle(p1, p2, p3, 2)

#creating the volume mesh
TriMeshVolume = MeshVolume(Mesh = triMesh)

#create the neighbor table
mntable = MNTable3D(minPoint, maxPoint, 2.5*maxradius, 1)

#packing the particles
packer = InsertGenerator3D(minRadius = minradius,
      maxRadius = minradius,
      insertFails = 1000,
      maxIterations = 1000,
      tolerance = 1.0e-6)
packer.generatePacking(volume = TriMeshVolume,
         ntable = mntable,
         groupID = 0,
         tag = 12)

#specifying the bonds between the particles in the mesh
mntable.generateBonds(groupID = 0,
        tolerance = 1.0e-5,
        bondID = 1234)

incline_bonds = BrittleBeamPrms(name = "incline_bonds",
    youngsModulus = 100000,
    poissonsRatio = 0.25,
    cohesion = 1,
    tanAngle = 1.0,
    tag = 1234)

#assigning density to the particles in the volume
sim.setParticleDensity(tag = 12,
   mask = -1,
   Density = 2650)

#output for the gengeo volume
mntable.write("test_gengeo.vtu", 2)
#=====================================================================================================

#Body Forces
#Gravity
sim.createInteractionGroup(GravityPrms(
    name = "gravity",
    acceleration = Vec3(0, -9.81, 0)))

#Linear viscosity
sim.createInteractionGroup(LinDampingPrms(
    name = "lin-damp",
    viscosity = 0.1,
    maxIterations = 100))

#create exclusion between bonded and unbonded interactions
sim.createExclusion(interactionName1 = "incline_bonds",
      interactionName2 = "particle-contact")

#create the boundaries and corresponding interaction groups
#(Z-direction)***
#BACK WALL
sim.createWall(name = "back_wall",
  posn = Vec3(0,0,0),
  normal = Vec3(0,0,1))
sim.createInteractionGroup(NRotElasticWallPrms(
    name = "backWall",
    wallName = "back_wall",
    normalK = 3.0e+07))
#FRONT WALL
sim.createWall(name = "front_wall",
  posn = Vec3(0,0,10),
  normal = Vec3(0,0,-1))
sim.createInteractionGroup(NRotElasticWallPrms(
    name = "frontWall",
    wallName = "front_wall",
    normalK = 3.0e+07))

#(X-direction)***
#RIGHT WALL

sim.createWall(name = "right_wall",
  posn = Vec3(0,0,0),
  normal = Vec3(1,0,0))
sim.createInteractionGroup(NRotElasticWallPrms(
    name = "rightWall",
    wallName = "right_wall",
    normalK = 3.0e+07))
#LEFT WALL
sim.createWall(name = "left_wall",
  posn = Vec3(40,0,0),
  normal = Vec3(-1,0,0))
sim.createInteractionGroup(NRotElasticWallPrms(
    name = "leftWall",
    wallName = "left_wall",
    normalK = 3.0e+07))

#(Y-direction)***
#TOP WALL
sim.createWall(name = "top_wall",
  posn = Vec3(0,40,0),
  normal = Vec3(0,-1,0))
sim.createInteractionGroup(NRotElasticWallPrms(
    name = "topWall",
    wallName = "top_wall",
    normalK = 3.0e+07))
#BOTTOM WALL
sim.createWall(name = "bottom_wall",
  posn = Vec3(0,0,0),
  normal = Vec3(0,1,0))
sim.createInteractionGroup(NRotElasticWallPrms(
    name = "bottomWall",
    wallName = "bottom_wall",
    normalK = 3.0e+07))

Hoping for your advice.

Kahlil Cui

Revision history for this message
Dion Weatherley (d-weatherley) said :
#14

Hi Kahlil,

There are a few issues with your current setup:

1) In order to import a geometry created using gengeo, you first need to save the geometry file using
mntable.write("myparticles.geo",1)

[you can put this just after your current mntable.write(..) command]

Once the geometry file is saved, you need to read the geometry into the ESyS-Particle simulation container using:
sim.readGeometry("myparticles.geo")

2) It is not a good idea to use the in-simulation geometry creation tools (RandomBoxPacker) in conjunction with gengeo. You are best to construct the entire model geometry in gengeo. You can use a BoxWithPlanes3D(..) Volume in gengeo to pack a box with particles, tag and bond them. After having constructed the geometry, save it and import the geometry per point 1) above.

3) It is important that you specify all other InteractionGroups (IGs) before specifying any Damping IGs. Move your LinDampingPrms IG specification to the end of the section defining your all your IGs

If you wish to send me your scripts and input files, please email me directly. My email address is available via my personal Launchpad page.

Cheers,

Dion

Revision history for this message
Kahlil Fredrick Cui (physicsman98) said :
#15

Hello Dion,

Thanks for your advice! Especially on the damping interactions which I have been doing wrong up until now it seems.
I would like to try this out by myself first. If it still proves too hard for me, I hope I can still ask for your help through e-mail.

Once again, thank you very much!

Kahlil Cui