Contact model for differentiating between static and dynamic friction

Asked by Paul Schröder

Hello dear YADE community,
recently I have been looking into how I can generally set the coefficient of friction for different materials using the angle of repose [1]. Furthermore, I am of course wondering whether I can also make a distinction between static and dynamic friction, or what effort this involves. Is such a distinction possible with the standard material model? Or is there perhaps already an example script?
With kind regards, Paul

[1] https://answers.launchpad.net/yade/+question/707367

Question information

Language:
English Edit question
Status:
Expired
For:
Yade Edit question
Assignee:
No assignee Edit question
Last query:
Last reply:

This question was reopened

Revision history for this message
Karol Brzezinski (kbrzezinski) said :
#1

Hi Paul,

I think that there is no ready-for-use function, but you can try to periodically inspect simulations to check whether they are sliding (e.g. Ip2_FrictMat_FrictMat_MindlinPhys() provides 'isSliding' parameter). First I would try to modify the interactions with a Python function. See example code below.

Cheers,
Karol

############
from yade import plot
###### PARAMS
mu_static = 0.8
mu_dynamic = 0.5

angle_static = atan(mu_static)
angle_dynamic = atan(mu_dynamic)

##### FUNCTIONS
def check_interactions():
    for ii in O.interactions:
        if ii.phys.isSliding:
            ii.phys.tangensOfFrictionAngle = mu_dynamic
        """ uncomment this part if it is logical in your case that interaction becomes static again
        else:
            ii.phys.tangensOfFrictionAngle = mu_static
        """

###### MATERIALS
O.materials.append(FrictMat(label='static'))
O.materials['static'].frictionAngle = angle_static

###### BODIES
sp1 = O.bodies.append(sphere((0,0,0),0.1, fixed = True, material = O.materials['static']))
sp2 = O.bodies.append(sphere((0,0.199,0),0.1, fixed = True, material = O.materials['static']))

# rotate one sphere
O.bodies[sp2].state.angVel = (5e-5,0,0)

###### ENGINES

O.engines=[
 ForceResetter(),
 InsertionSortCollider([Bo1_Sphere_Aabb()]),
 InteractionLoop(
  [Ig2_Sphere_Sphere_ScGeom()],
  [Ip2_FrictMat_FrictMat_MindlinPhys()],
  [Law2_ScGeom_MindlinPhys_Mindlin()],
 ),
 NewtonIntegrator(),
 PyRunner(command = "plot.addData(t = O.time, F = O.interactions[0,1].phys.shearForce.norm())", virtPeriod = 1),
 PyRunner(command = "check_interactions()", iterPeriod = 100),#
]

O.dt = PWaveTimeStep()*0.5

plot.plots = {'t':'F'}
plot.plot()

O.run()

Revision history for this message
Paul Schröder (paul5678) said :
#2

Thanks Karol Brzezinski, that solved my question.

Revision history for this message
Paul Schröder (paul5678) said :
#3

Thanks for your feedback, Karol and thanks for the sample code,

that helped me a lot and also answered my question so far. I just have a small question about this, which is rather less related to the friction value itself:
Why does the rotational speed of the particle sp1 not decrease despite the counteracting friction force. How can friction dissipation be activated in the Mindlin-material-model?

In addition, for future readers, I would like to extend the above example in the code shown below to include the friction values from the different material pairings distinguished in my other question.

With best wishes, Paul

############
from yade import plot
###### PARAMS
mu_static00 = 0.8
mu_static01 = 0.4
mu_static11 = 0.1
mu_dynamic00 = 0.5
mu_dynamic01 = 0.3
mu_dynamic11 = 0.1

##### FUNCTIONS
def check_interactions():
    for i in O.interactions:
        b1, b2 = O.bodies[i.id1],O.bodies[i.id2]
        if i.phys.isSliding:
            if b1.mat.id == idMat0 and b2.mat.id == idMat0:
                i.phys.tangensOfFrictionAngle = mu_dynamic00
            elif (b1.mat.id == idMat0 and b2.mat.id == idMat1) or (b1.mat.id == idMat1 and b2.mat.id == idMat0):
                i.phys.tangensOfFrictionAngle = mu_dynamic01
            elif b1.mat.id == idMat1 and b2.mat.id == idMat1:
                i.phys.tangensOfFrictionAngle = mu_dynamic11
            else:
                print("Kombination Gleitreibpartner nicht vorgesehen")
        else:
            if b1.mat.id == idMat0 and b2.mat.id == idMat0:
                i.phys.tangensOfFrictionAngle = mu_static00
            elif (b1.mat.id == idMat0 and b2.mat.id == idMat1) or (b1.mat.id == idMat1 and b2.mat.id == idMat0):
                i.phys.tangensOfFrictionAngle = mu_static01
            elif b1.mat.id == idMat1 and b2.mat.id == idMat1:
                i.phys.tangensOfFrictionAngle = mu_static11
            else:
                print("Kombination Haftreibpartner nicht vorgesehen")

###### MATERIALS
idMat0 = O.materials.append(FrictMat(frictionAngle = atan(mu_static00), label='Mat0'))
idMat1 = O.materials.append(FrictMat(frictionAngle = atan(mu_static11), label='Mat1'))

###### BODIES
sp1 = O.bodies.append(sphere((0,0,0),0.1, fixed = True, material = O.materials['Mat0']))
sp2 = O.bodies.append(sphere((0,0.199,0),0.1, fixed = True, material = O.materials['Mat1']))

# rotate one sphere
O.bodies[sp1].state.angVel = (2.5e-3,0,0)

###### ENGINES
O.engines=[
 ForceResetter(),
 InsertionSortCollider([Bo1_Sphere_Aabb()]),
 InteractionLoop(
  [Ig2_Sphere_Sphere_ScGeom()],
  [Ip2_FrictMat_FrictMat_MindlinPhys()],
  [Law2_ScGeom_MindlinPhys_Mindlin()],
 ),
 NewtonIntegrator(),
 PyRunner(command = "plot.addData(t = O.time, F = O.interactions[0,1].phys.shearForce.norm(), v1 = O.bodies[sp1].state.angVel[0], v2 = O.bodies[sp2].state.angVel[0])", virtPeriod = 1),
 PyRunner(command = "check_interactions()", iterPeriod = 100),#
]

O.dt = PWaveTimeStep()*0.5

plot.plots = {'t':(('F','b-'),None,('v1','g--'),('v2','r--'))}
plot.plot(subPlots = False)

O.run()

Revision history for this message
Launchpad Janitor (janitor) said :
#4

This question was expired because it remained in the 'Open' state without activity for the last 15 days.