Download this testcase.

3D Hourglass Simulation

This example simulates the discharge of granular particles through a three-dimensional hourglass geometry. An initial particle deposit is loaded from a pre-generated configuration. Particles fall under gravity through a narrow orifice and accumulate at the bottom.

Keywords

DEM, 3D, Granular Flow, Hourglass

import os
import shutil
import subprocess

import numpy as np
from migflow import scontact, time_integration

Parameters

np.random.seed(0)

h = 4.0
l = 1.0
e = 0.5
d = 0.01

outputdir = "output"
shutil.rmtree(outputdir, ignore_errors=True)
os.makedirs(outputdir, exist_ok=True)

t = 0.0
dt = 5e-4
i = 0
outf = 20
g = np.array([0, 9.81, 0])

Load particle problem

p = scontact.ParticleProblem(3)
# Ready-made initial deposit or generate it if not existing
inputdir = "hourglass-deposit"
if inputdir not in os.listdir():
    # run the initial deposit generation script
    print(f"Generating initial deposit in directory '{inputdir}'...")
    subprocess.call(["python3", "3d_gen_initial_deposit.py"])
else:
    print(f"Using existing directory '{inputdir}' for initial deposit.")
    p.read_mig(inputdir, iteration=-1)

# Slightly shrink particles
p.r()[:] *= 0.9

Time integration loop

tEnd = 1.0
while t < tEnd:
    mass = 4 / 3 * np.pi * p.r() ** 3
    forces = mass * g

    time_integration._advance_particles(p, forces, dt, 1, 1e-3 * d)

    if i % outf == 0:
        print("t =", t)
        p.write_mig(outputdir, t)

    t += dt
    i += 1