← Back to team overview

yade-users team mailing list archive

[Question #245675]: Enforcing rolling/normal/tangential/rotational spring parameters for a 2D biaxial system

 

New question #245675 on Yade:
https://answers.launchpad.net/yade/+question/245675

Hello,

I hope you are well.

I am trying to create some simple biaxial simulations (effectively 2D) of spherical particles in Yade. I have had success with simple material properties such as FrictMat(), but would like to extend them to incorporate moment transfer, enforcing some rolling friction to emulate real particles.

>From my understanding of the documentation, I need to involve the use of CohFrictMat() materials, disabling cohesion via isCohesive=False, and enabling momentRotationLaw=True.

My question is: is CohFrictMat() the appropriate material type to incorporate things such as rolling friction --- while disabling cohesion?
If so, how I would go about specifying properties within CohFrictMat() such as:
- Rolling friction,
- Normal spring stiffness k_n
- Tangential spring stiffness k_t
- Rotational spring stiffness k_r

Below I have a simple script setting up a quasi-2D system with CohFrictMat() and loading to isotropic conditions.

Regards,
Sebastian





#______________________________________________________________________________
# Simulation parameters
seed = 1
number_of_particles = 1000

# Materials
material_particle = CohFrictMat(density = 2600,
    isCohesive = False,
    momentRotationLaw = True,
    poisson = 0.25,
    young = 1e9,
    frictionAngle = 0.7,
)

material_wall_topbottom = material_particle

material_wall_leftright = CohFrictMat(density = 1000,
    isCohesive = False,
    momentRotationLaw = True,
    poisson = 0.25,
    young = 1e9,
    frictionAngle = 0.0,
)

wall_min, wall_max = Vector3(0,0,-1), Vector3(1,1,1)
cloud_min, cloud_max = Vector3(0,0,0), Vector3(1,1,0)

#______________________________________________________________________________
# Simulation objects

# Walls
wall_obj = utils.aabbWalls(extrema = [wall_min, wall_max])
wall_obj[0].material = material_wall_leftright # min X
wall_obj[1].material = material_wall_leftright # max X
wall_obj[2].material = material_wall_topbottom # min Y
wall_obj[3].material = material_wall_topbottom # max Y
wall_obj[4].material = material_wall_topbottom # min Z
wall_obj[5].material = material_wall_topbottom # max Z

wall_ids = O.bodies.append(wall_obj)

# Particles
sp = pack.SpherePack()
sp.makeCloud(minCorner = cloud_min, maxCorner = cloud_max,
    rMean = 0.005, rRelFuzz = 0.5, num = number_of_particles, seed=seed)
sp.toSimulation()

# Set particle material
for body in O.bodies:
    if isinstance(body.shape, Sphere):
        body.material = material_particle

# Enforce 2D
for body in O.bodies:
    if isinstance(body.shape, Sphere):
        body.state.blockedDOFs = 'zXY'

# Loading programme
triax_loading = TriaxialStressController(
    goal1 = confining_pressure,
    goal2 = confining_pressure,
    goal3 = 0, # nothing on Z walls since we're 2D
    #maxMultiplier = 1.0001,
    wall_front_activated = False,
    wall_back_activated = False,
)

#______________________________________________________________________________
# Calculation loop
O.engines = [
    ForceResetter(),
    InsertionSortCollider([
        Bo1_Sphere_Aabb(),
        Bo1_Wall_Aabb(),
        Bo1_Box_Aabb(),
    ]),
    InteractionLoop([
        Ig2_Sphere_Sphere_ScGeom6D(),
        Ig2_Box_Sphere_ScGeom6D()
        ], [
        Ip2_CohFrictMat_CohFrictMat_CohFrictPhys(
            ),
        ], [
        Law2_ScGeom6D_CohFrictPhys_CohesionMoment(
            always_use_moment_law = True,
            ),
        ]
    ),
    triax_loading,
    NewtonIntegrator(),
    PyRunner(command = 'checkEquilibrium()', iterPeriod = 1000),
]

O.dt = 0.5 * utils.PWaveTimeStep()
O.usesTimeStepper = True
O.saveTmp()

def checkEquilibrium():
    if unbalancedForce() < 1e-3:
        print "Equilibrium reached"
        O.pause()
        print "Calming simulation"
        utils.calm()
        print "Saving isotropic state"
        O.save('test.xml.bz2')

-- 
You received this question notification because you are a member of
yade-users, which is an answer contact for Yade.