Friction between walls and 'rock'

Asked by Panos on 2019-10-22

Hello everyone,
I am trying to simulate an indirect tensile test. I would like
to take in account the friction between the walls and ‘rock’.
Even thought i assign properties to the walls the results
do not differ.
Could you point what am i doing wrong. Thanx
Here is the code.

from __future__ import print_function
from yade import pack, plot

################# BRAZILIAN SIMULATION DEFINED HERE
####Material microproperties from table
readParamsFromTable(noTableOk=True, # unknownOk=True,
 Specimen_Radius = 0.02735,
 Specimen_Thickness = 0.025,
 Sphere_Radius = 1e-3,
 intR=1.15,
 DENSITY=2700,
 YOUNG=100e9,
 FRICTION_ANGLE=30,
 POISSON=1,
 TENS=10e6,
 COH=100e6,
)

from yade.params.table import *

#### material definition
Sample = O.materials.append(JCFpmMat(
young=YOUNG,
poisson=POISSON,
frictionAngle=radians(FRICTION_ANGLE),
cohesion=COH,
tensileStrength=TENS,
density = DENSITY,
label='spheres'
))

#### create the specimen
sp=pack.randomDensePack(
 pack.inCylinder((0,0,0),(Specimen_Thickness,0,0),Specimen_Radius),
 radius = Sphere_Radius,
 spheresInCell = 1000,
 material=Sample,
 rRelFuzz=0.2,
 memoizeDb = '/tmp/packing-brazilian.db',
 returnSpherePack = True,
)
sp.toSimulation()

# walls
zMin,zMax=[pt[2] for pt in aabbExtrema()]
wallIDs = O.bodies.append([wall((0,0,z),2) for z in (zMin,zMax)])
O.materials.append(JCFpmMat(young=150e9,poisson=1,frictionAngle=radians(65),density=150e10,label='wall'))
walls = wallMin,wallMax = [O.bodies[i] for i in wallIDs]
v =1
wallMin.state.vel = (0,0,+v)
wallMax.state.vel = (0,0,-v)

#engines
O.engines=[
ForceResetter(),
 InsertionSortCollider([Bo1_Sphere_Aabb(aabbEnlargeFactor=intR,label='is2aabb'),Bo1_Wall_Aabb()]),
 InteractionLoop(
  [Ig2_Sphere_Sphere_ScGeom(interactionDetectionFactor=intR,label='ss2sc'),Ig2_Wall_Sphere_ScGeom()],
  [Ip2_JCFpmMat_JCFpmMat_JCFpmPhys(cohesiveTresholdIteration=1,label='interactionPhys')],
  [Law2_ScGeom_JCFpmPhys_JointedCohesiveFrictionalPM(recordCracks=True,Key=OUT,label='interactionLaw')],
 ),
     GlobalStiffnessTimeStepper(active=1,timeStepUpdateInterval=10,timestepSafetyCoefficient=0.5, defaultDt=utils.PWaveTimeStep()),
 NewtonIntegrator(damping=0.5),
 PyRunner(iterPeriod=100,command='addPlotData()',initRun=True),
      PyRunner(iterPeriod=100,command='stopIfDamaged()'),

]

# stop condition
def stopIfDamaged():
 if O.iter < 10: # do nothing at the beginning
  return
 SMax = max(plot.data["stress"])
 S = plot.data["stress"][-1]
 if S<(0.8*SMax):
  print("Damaged, stopping.")
  print("ft = ",max(plot.data["stress"]))
  O.pause()

# plot stuff
def addPlotData():
 # forces of walls. f1 is "down", f2 is "up" (f1 needs to be negated for evlauation)
 f1,f2 = [O.forces.f(i)[2] for i in wallIDs]
 f1*=-1
 # average force
 f = 0.5*(f1+f2)
 # displacement (2 times each wall)
 wall = O.bodies[wallIDs[0]]
 dspl = 2*wall.state.displ()[2]
 # stress (according to standard brazilian test evaluation formula)
 stress = f/(pi*Specimen_Radius*Specimen_Thickness)
 # store values
 yade.plot.addData(
  t = O.time,
  i = O.iter,
  dspl = dspl,
  stress = stress,
  te = interactionLaw.nbTensCracks,
         se = interactionLaw.nbShearCracks,
 )
        plot.saveDataTxt(OUT)

# plot dspl on x axis, stress on y1 axis and f,f1,f2 in y2 axis
plot.plots={'dspl':'stress'}

O.step();
ss2sc.interactionDetectionFactor=1.
is2aabb.aabbEnlargeFactor=1.

plot.plot()
O.run()

Question information

Language:
English Edit question
Status:
Solved
For:
Yade Edit question
Assignee:
No assignee Edit question
Solved by:
Luc Scholtès
Solved:
2019-10-23
Last query:
2019-10-23
Last reply:
2019-10-23

Hello Panos,
"the results do not differ" is a much too vague statement of the problem.
Did you inspect shear forces on the wall and are they are strictly null (which is what your question suggests)? Please show a clear issue.
Bruno

Panos (panoschristo) said : #2

Thank you Bruno for your response

What im trying to say is that despite the fact i assign properies on the walls (or when i dont)
The Force - Displacement curve i get is the same.
In actual real life experiments both strenght and failure mechanism, differ due to friction between plates and rock.
I want to 'capture' that behavior on my simulation as well.

Jérôme Duriez (jduriez) said : #3

Hi,

Another test could be to inspect your "wall" and "rock" bodies (mixing here bodies and Material but I hope you get the point) and see whether they do have different Material properties, or not.

With the following in your script:
> wallIDs = O.bodies.append([wall((0,0,z),2) for z in (zMin,zMax)])
> O.materials.append(JCFpmMat(young=150e9,poisson=1,frictionAngle=radians(65),density=150e10,label='wall'))

your wall bodies (of Ids wallIDs) will have as material properties the one of O.materials['spheres'], because it's the last material defined at the time you create these wall bodies.
On the other hand, O.materials['wall'] seems to me as being never applied to any body here.

I'm fearing you're actually not imposing what you wanted to.

Best Luc Scholtès (luc) said : #4

Hi Panos,

Jerome is right about how to define the material when appending your walls.

Also, keep in mind that friction between different bodies is, by default, governed by the lowest friction angles of these 2 bodies (the interaction law is formulated such as: interactionFrictionAngle=min(FrictionAngleOfBody1, FrictionAngleOfBody2)). This means that you can set the spheres to wall friction angle between 0 and the sphere friction angle (30 in your example), but not above.

A way to simulate "extreme" friction between the wall and the spheres would be to block some Degrees Of Freedom of the spheres in contact with the wall to avoid their tangential displacement (e.g., blocking X and Y components of the spheres if the wall moves along Z).

Luc

Panos (panoschristo) said : #5

Thanks Luc Scholtès, that solved my question.