Day 1 - Yade Hands-on part 1

Let’s create a bouncing sphere

First we need to define a material for our sphere:

# Start by defining a material
O.materials.append(FrictMat(young=1.0e9, poisson=0.2, density=2500, label='frictmat'))

O is our scene, it contains all the information that we need to run a DEM simulation. We can edit various components of the scene such as materials here. We use the python function .append() to add this material to the existing list of materials inside Python.

The FrictMat is a type of material available in Yade. Yade boasts a wide variety of materials such as CohFrictMat. These materials all have different constitutive laws associated with them. For now we stick with the simplest one, FrictMat.

Next, we need to create two spheres by appending two bodies to our scene, O:

O.bodies.append(
    [
    # fixed: particle's position in space will not change (support)
    sphere(center=(0, 0, 0), radius=.5, fixed=True),
    # this particles is free, subject to dynamics
    sphere((0, 0, 2), .5)
    ]
)

We see that we appended a sphere to the scene by designating its center and radius. Yade has a variety of shapes that can be appended as bodies such as Facet, Box, and others.

Now it is time to define how these spheres should move. The scene O has an “engines” list in O.engines which is a list of actions that are taken for each iteration in our simulation.

O.engines = [
    ForceResetter(),
    InsertionSortCollider([Bo1_Sphere_Aabb()]),
    InteractionLoop(
            [Ig2_Sphere_Sphere_ScGeom()],  # collision geometry
            [Ip2_FrictMat_FrictMat_FrictPhys()],  # collision "physics"
            [Law2_ScGeom_FrictPhys_CundallStrack()]  # contact law -- apply forces
    ),
    # Apply gravity force to particles. damping: numerical dissipation of energy.
    NewtonIntegrator(gravity=(0, 0, -9.81), damping=0.1)
]

Some of this may look foreign to you, but there is a logic to it. The ForceResetter() resets all forces stored in the scene, InsertionSortCollider is simply creating a sorted list of possible body interactions. InteractionLoop() is where we assign the interaction geometry (Ig2_Sphere_Sphere_ScGeom()) which conveniently matches our appended body shape (Sphere), the collision physics Ip2_FrictMat_FrictMat_FrictPhys() conveniently matches our material assignment (FrictMat). Finally, the constitutive law is defined with Law2_ScGeom_FrictPhys_CundallStrack(), so we are using the classical CundallStrack contact law here. The timeintegration occurs in the last component NewtonIntegrator where we can add a gravitational force and damping.

Although we have already added our material, body, and engines to the scene, we should still take care to define the time step in O.dt:

O.dt = .5 * PWaveTimeStep()

Where the PWaveTimeStep() automatically estimates the critical time step associated with the stiffness of the packing. We factor that down by 1/2 to be safe, since it is but an estimate.

Starting the Script

Now that we have the full script written for our bouncing ball, it is time to start it by executing:

yade bouncing_sphere.py

in our terminal.