DEM model

Inputs for the discrete element method (DEM), used when solids.model = dem (see particle options). Every type listed in solids is a DEM type.

Contact model

The following input is defined with the prefix dem:

Description

Type

Default

contact_model

Contact model for particle-particle and particle-wall collisions.

Options:

  • lsd : Linear spring-dashpot.

  • hertz : Hertz-Mindlin.

String

lsd

The linear spring-dashpot model takes the following inputs, defined with the prefix dem.lsd:

Description

Type

Default

spring_const.pp

Normal spring constant :: particle to particle collisions [required]

Real

0

spring_const.pw

Normal spring constant :: particle to wall collisions [required]

Real

0

spring_tang_fac.pp

Tangential-to-normal spring constant factor :: particle to particle collisions

Real

0.2857

spring_tang_fac.pw

Tangential-to-normal spring constant factor :: particle to wall collisions

Real

0.2857

damping_tang_fac.pp

Factor relating the tangential damping coefficient to the normal damping coefficient :: particle to particle collisions

Real

0.5

damping_tang_fac.pw

Factor relating the tangential damping coefficient to the normal damping coefficient :: particle to wall collisions

Real

0.5

The Hertz-Mindlin model [TTI92] stiffens as particles overlap. For a contact with effective radius \(R^*\), effective mass \(m^*\) and overlap \(\delta\), the normal force is \(\frac{4}{3} E^* \sqrt{R^*} \delta^{3/2}\) and the tangential stiffness is \(8 G^* \sqrt{R^* \delta}\), where \(E^*\) and \(G^*\) are the effective Young’s and shear moduli of the two materials. The normal damping is set from the restitution coefficient so that it holds at every impact velocity. The tangential stiffness and damping act only with dem.tan_history. Each contact uses its own particles’ radii and masses, so particles of different sizes within a type are handled exactly. The model takes the following inputs, defined with the prefix dem.hertz:

Description

Type

Default

youngs_modulus.[dem_solid]

Young’s modulus of the type’s particles (Pa) [required]

Real

None

youngs_modulus.wall

Young’s modulus of the walls (Pa) [required]

Real

None

poisson_ratio.[dem_solid]

Poisson ratio of the type’s particles, greater than -1 and at most 0.5 [required]

Real

None

poisson_ratio.wall

Poisson ratio of the walls, greater than -1 and at most 0.5 [required]

Real

None

damping_tang_fac.pp

Factor relating the tangential damping coefficient to the normal damping coefficient :: particle to particle collisions

Real

0.5

damping_tang_fac.pw

Factor relating the tangential damping coefficient to the normal damping coefficient :: particle to wall collisions

Real

0.5

The solids time step is set differently by the two models: from the collision time with lsd, and from the Rayleigh time with hertz (see DEM time step).

Restitution coefficients

The following inputs use the solids type names from solids to define restitution coefficients and are defined with the prefix dem.restitution_coeff. They must be defined for every solid-solid and solid-wall combination.

Description

Type

Default

[dem_solid].[dem_solid2]

Specifies the restitution coefficient between DEM solids. Order is not important and this could be defined as [dem_solid2].[dem_solid]. If both are defined they must be equal.

Real

0

[dem_solid].wall

Specifies the restitution coefficient between solid and the wall. Order is not important and this could be defined as wall.[dem_solid]. If both are defined they must be equal.

Real

0

Friction and tangential history

The following inputs apply to every contact model and are defined with the prefix dem:

Description

Type

Default

friction_coeff.pp

Friction coefficient :: particle to particle collisions [required]

Real

0

friction_coeff.pw

Friction coefficient :: particle to wall collisions [required]

Real

0

tan_history

Include tangential history force in the collision model.

Bool

false

tan_history.max_contacts

Maximum number of contacts per particle tracked at any point when tangential history is enabled.

Int

10

rolling_friction

Rolling friction model [ACRO11, BVB+19, WK12, ZWY+99]

Options:

  • None

  • ModelA

    \(\boldsymbol{\tau}_{ij}^{(r)} = -\mu_{r}\hat{r}_{ij} \left| f_{ij}^{(n)} \right| \frac{\omega_{ij}}{\left|\omega_{ij}\right|}\)

  • ModelB

    \(\boldsymbol{\tau}_{ij}^{(r)} = -\mu_{r}\hat{r}_{ij} \left| f_{ij}^{(n)} \right| \boldsymbol{u}_{ij}^{\omega}\)

String

None

rolling_friction.coefficient

Rolling friction coefficient when using a rolling friction model

Real

0

Example

Below is an example for specifying the inputs for two DEM solids.

solids       = sand  char
solids.model = dem

dem.contact_model = lsd

dem.lsd.spring_const.pp     =   100.0
dem.lsd.spring_const.pw     =   100.0

dem.lsd.spring_tang_fac.pp  =     0.2857
dem.lsd.spring_tang_fac.pw  =     0.2857

dem.lsd.damping_tang_fac.pp =     0.5
dem.lsd.damping_tang_fac.pw =     0.5

dem.friction_coeff.pp       =     0.25
dem.friction_coeff.pw       =     0.15

dem.restitution_coeff.sand.sand =  0.85
dem.restitution_coeff.sand.char =  0.88
dem.restitution_coeff.char.char =  0.90

dem.restitution_coeff.sand.wall =  0.85
dem.restitution_coeff.char.wall =  0.89

The same solids with the Hertz-Mindlin model:

dem.contact_model = hertz

dem.hertz.youngs_modulus.sand =  7.0e10
dem.hertz.youngs_modulus.char =  5.0e9
dem.hertz.youngs_modulus.wall =  2.0e11

dem.hertz.poisson_ratio.sand  =  0.25
dem.hertz.poisson_ratio.char  =  0.3
dem.hertz.poisson_ratio.wall  =  0.3

The friction and restitution coefficients are given as for lsd.

Implicit drag

By default (solids.momentum.update = explicit), the fluid-particle drag force is applied explicitly to particles,

\[u_p^{n^{\prime}+1} = u_p^{n^\prime} + dt_{\mathrm{DEM}}\left(\beta^n (u_f^{n+1} - u_p^{n}) + \mathcal{F}_p^{n^\prime}\right)/m_p\]

where \(u_p\) is the p-th particle velocity at the indicated time level, \(\beta^n\) is the drag coefficient, \(u_f^{n+1}\) is the fluid velocity, \(\mathcal{F}_p\) are all non-drag forces (e.g., gravitational, buoyancy, collision etc.), and \(m_p\) is particle mass. Terms exist at different time levels due in part to how the fluid and particle models are coupled and partly because particles typically sub-step in time. Specifically, a time step advances the fluid from \(t^n\) to \(t^{n+1}\), then particles take multiple smaller time steps to traverse the same total time. In the above equation, prime markers differentiate quantities updated at each DEM sub-step.

The updated particle velocity, \(u_p^{n^{\prime}+1}\), is substituted into the drag expression when solids.momentum.update = implicit.

\[u_p^{n^{\prime}+1} = \frac{u_p^{n^\prime} + dt_{\mathrm{DEM}}\left( \beta^n u_f^{n+1} + \mathcal{F}_p^{n^\prime} \right)/m_p}{1 + dt_{\mathrm{DEM}} \beta^n / m_p}\]

By using the updated velocity, the drag force computed for the fluid and particles is inconsistent, and interphase momentum is not conserved. However, implicit drag may be needed for numerical stability when the particle density is much less than the fluid (such as bubbles). The implicit update is required when virtual mass is included, and the virtual mass coefficient is added to the particle mass in the denominator.