In this module the core routines of the Discrete Element Method (DEM) for simulating particle-laden flows are implemented.
Two types of particle simulations are supported: unresolved Discrete Particle Simulations (DPS) and fully resolved Momentum-Exchange Method simulations.
| Type | Visibility | Attributes | Name | Initial | |||
|---|---|---|---|---|---|---|---|
| real(kind=rk), | public | :: | logger_Flift(3) | = | 0.0_rk | ||
| real(kind=rk), | public | :: | logger_Fdrag(3) | = | 0.0_rk |
Update particle position using Verlet integration
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| type(mus_particle_MEM_type), | intent(inout) | :: | this | |||
| real(kind=rk), | intent(in) | :: | dt |
Update particle position using Verlet integration
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| type(mus_particle_DPS_type), | intent(inout) | :: | this | |||
| real(kind=rk), | intent(in) | :: | dt |
Update particle continuous position using Euler integration
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| type(mus_particle_MEM_type), | intent(inout) | :: | this | |||
| real(kind=rk), | intent(in) | :: | dt |
Time step |
Update particle continuous position using Euler integration
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| type(mus_particle_DPS_type), | intent(inout) | :: | this | |||
| real(kind=rk), | intent(in) | :: | dt |
Time step |
Update particle velocity according to current forces on particle using Euler integration
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| type(mus_particle_MEM_type), | intent(inout) | :: | this | |||
| real(kind=rk), | intent(in) | :: | dt |
Time step |
Update particle velocity according to current forces on particle using Euler integration
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| type(mus_particle_DPS_type), | intent(inout) | :: | this | |||
| real(kind=rk), | intent(in) | :: | dt |
Time step |
Update particle velocity using Verlet integration
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| type(mus_particle_MEM_type), | intent(inout) | :: | this | |||
| real(kind=rk), | intent(in) | :: | dt |
Update particle velocity using Verlet integration
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| type(mus_particle_DPS_type), | intent(inout) | :: | this | |||
| real(kind=rk), | intent(in) | :: | dt |
Swap the indices of Fnow and Fnext pointing to the force at the current and next time step respectively
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| type(mus_particle_MEM_type), | intent(inout) | :: | this |
Swap the indices of Fnow and Fnext pointing to the force at the current and next time step respectively
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| type(mus_particle_DPS_type), | intent(inout) | :: | this |
Routine for computing the collision force between particles and walls for the case of a simple prismatic domain with walls aligned with the Cartesian axes.
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| type(mus_particle_DPS_type), | intent(inout) | :: | this |
Particle to collide |
||
| type(mus_particle_boundarydata_type) | :: | boundaryData |
Boundary data containing information on wall location |
|||
| real(kind=rk), | intent(in) | :: | eps |
Threshold gap at which to call it a collision |
||
| real(kind=rk), | intent(in) | :: | kn |
Spring coefficient |
||
| real(kind=rk), | intent(in) | :: | dn |
Damping coefficient |
DEMsubcycles runs Nsubcycles time integration steps per LBM time step In this routine simple Forward Euler integration of particle position and velocity is used.
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| type(mus_particle_group_type), | intent(inout) | :: | particleGroup |
Array of particles |
||
| type(mus_scheme_type), | intent(inout) | :: | scheme |
Scheme for access to leveldescriptor |
||
| type(mus_geom_type), | intent(in) | :: | geometry |
Geometry for access to tree |
||
| type(mus_param_type), | intent(in) | :: | params |
Params for access to dt, dx, etc. |
||
| integer, | intent(in) | :: | Nsubcycles |
Number of subcycles |
DEMsubcycles runs Nsubcycles time integration steps per LBM time step In this routine velocity verlet integration of particle position and velocity is used.
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| type(mus_particle_group_type), | intent(inout) | :: | particleGroup |
Array of particles |
||
| type(mus_scheme_type), | intent(inout) | :: | scheme |
Scheme for access to leveldescriptor |
||
| type(mus_geom_type), | intent(in) | :: | geometry |
Geometry for access to tree |
||
| type(mus_param_type), | intent(in) | :: | params |
Params for access to dt, dx, etc. |
||
| integer, | intent(in) | :: | Nsubcycles |
Number of subcycles |
DEMsubcycles runs Nsubcycles time integration steps per LBM time step In this routine velocity verlet integration of particle position and velocity is used. This routine is for one-way coupled DPS particles.
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| type(mus_particle_group_type), | intent(inout) | :: | particleGroup |
Array of particles |
||
| type(mus_scheme_type), | intent(inout) | :: | scheme |
Scheme for access to leveldescriptor |
||
| type(mus_geom_type), | intent(in) | :: | geometry |
Geometry for access to tree |
||
| type(mus_param_type), | intent(in) | :: | params |
Params for access to dt, dx, etc. |
||
| integer, | intent(in) | :: | Nsubcycles |
Number of subcycles |
Update particle continuous position using Euler integration
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| type(mus_particle_MEM_type), | intent(inout) | :: | this | |||
| real(kind=rk), | intent(in) | :: | dt |
Time step |
Update particle continuous position using Euler integration
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| type(mus_particle_DPS_type), | intent(inout) | :: | this | |||
| real(kind=rk), | intent(in) | :: | dt |
Time step |
Update particle velocity according to current forces on particle using Euler integration
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| type(mus_particle_MEM_type), | intent(inout) | :: | this | |||
| real(kind=rk), | intent(in) | :: | dt |
Time step |
Update particle velocity according to current forces on particle using Euler integration
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| type(mus_particle_DPS_type), | intent(inout) | :: | this | |||
| real(kind=rk), | intent(in) | :: | dt |
Time step |
Update particle position using Verlet integration
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| type(mus_particle_MEM_type), | intent(inout) | :: | this | |||
| real(kind=rk), | intent(in) | :: | dt |
Update particle position using Verlet integration
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| type(mus_particle_DPS_type), | intent(inout) | :: | this | |||
| real(kind=rk), | intent(in) | :: | dt |
Update particle velocity using Verlet integration
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| type(mus_particle_MEM_type), | intent(inout) | :: | this | |||
| real(kind=rk), | intent(in) | :: | dt |
Update particle velocity using Verlet integration
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| type(mus_particle_DPS_type), | intent(inout) | :: | this | |||
| real(kind=rk), | intent(in) | :: | dt |
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| type(mus_particle_group_type), | intent(inout) | :: | particleGroup |
Array of particles |
||
| type(mus_scheme_type), | intent(inout) | :: | scheme |
Scheme for access to leveldescriptor |
||
| type(mus_geom_type), | intent(in) | :: | geometry |
Geometry for access to tree |
||
| type(mus_param_type), | intent(in) | :: | params |
Params for access to dt, dx, etc. |
||
| type(mus_particle_boundarydata_type) | :: | boundaryData |
Domain boundary information for particle-wall collisions |
Compute collision forces using Discrete Element Method between particles local to this process i.e. both particles are owned by this process.
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| type(mus_particle_group_type), | intent(inout) | :: | particleGroup |
particleGroup to search for collisions in |
||
| integer, | intent(in) | :: | myRank |
This proc's rank |
||
| real(kind=rk), | intent(in) | :: | eps |
Threshold gap at which to call it a collision |
||
| real(kind=rk), | intent(in) | :: | Tc |
DEM collision time, used for calculating spring and damper coefficients |
||
| real(kind=rk), | intent(in) | :: | mu |
Fluid dynamic viscosity (physical units) |
Compute collision forces using Discrete Element Method between particles local to this process i.e. both particles are owned by this process.
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| type(mus_particle_group_type), | intent(inout) | :: | particleGroup |
particleGroup to search for collisions in |
||
| integer, | intent(in) | :: | myRank |
This proc's rank |
||
| real(kind=rk), | intent(in) | :: | eps |
Threshold gap at which to call it a collision |
||
| real(kind=rk), | intent(in) | :: | Tc |
DEM collision time, used for calculating spring and damper coefficients |
||
| real(kind=rk), | intent(in) | :: | mu |
Fluid dynamic viscosity, in physical units |
Compute collision forces using Discrete Element Method between particle pairs where particles belong to different processes.
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| type(mus_particle_group_type), | intent(inout) | :: | particleGroup |
particleGroup to search for collisions in |
||
| integer, | intent(in) | :: | myRank |
This proc's rank |
||
| real(kind=rk), | intent(in) | :: | eps |
Threshold gap at which to call it a collision |
||
| real(kind=rk), | intent(in) | :: | Tc |
DEM collision time, used for calculating spring and damper coefficients |
||
| real(kind=rk), | intent(in) | :: | mu |
Fluid dynamic viscosity, physical units |
Compute collision forces using Discrete Element Method between particle pairs where particles belong to different processes.
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| type(mus_particle_group_type), | intent(inout) | :: | particleGroup |
particleGroup to search for collisions in |
||
| integer, | intent(in) | :: | myRank |
This proc's rank |
||
| real(kind=rk), | intent(in) | :: | eps |
Threshold gap at which to call it a collision |
||
| real(kind=rk), | intent(in) | :: | Tc |
DEM collision time, used for calculating spring and damper coefficients |
||
| real(kind=rk), | intent(in) | :: | mu |
Fluid dynamic viscosity, physical units |
DEM_computeExternalForces adds the non-DEM forces (including hydrodynamic force from the LBM) to F_DEM which is used to update velocity within the DEM subcycle.
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| type(mus_particle_group_type), | intent(inout) | :: | particleGroup |
particleGroup to search for collisions in |
DEM_computeExternalForces adds the non-DEM forces (including hydrodynamic force from the LBM) to F_DEM which is used to update velocity within the DEM subcycle.
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| type(mus_particle_group_type), | intent(inout) | :: | particleGroup |
particleGroup to search for collisions in |
||
| real(kind=rk), | intent(in) | :: | nu |
Fluid dynamic viscosity (physical units) for computing hydro forces |
||
| integer, | intent(in) | :: | myRank |
This process rank |
DEM_computeExternalForces adds the non-DEM forces (including hydrodynamic force from the LBM) to F_DEM which is used to update velocity within the DEM subcycle.
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| type(mus_particle_group_type), | intent(inout) | :: | particleGroup |
particleGroup to search for collisions in |
||
| real(kind=rk), | intent(in) | :: | nu |
Fluid dynamic viscosity (physical units) for computing hydro forces |
||
| integer, | intent(in) | :: | myRank |
This process rank |
DEM_computeWallForces_DPS computes the forces on particles as a result of collisions with walls described in the boundaryData object. These forces are only computed for particles owned by this process.
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| type(mus_particle_group_type), | intent(inout) | :: | particleGroup |
particleGroup to search for collisions in |
||
| type(mus_particle_boundarydata_type), | intent(in) | :: | boundaryData |
Data about particle domain boundaries |
||
| real(kind=rk), | intent(in) | :: | eps |
threshold at which gap to call it a collision |
||
| real(kind=rk), | intent(in) | :: | Tc |
Collision time |
||
| integer, | intent(in) | :: | myRank |
This process rank |
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| type(mus_particle_group_type), | intent(inout) | :: | particleGroup |
particleGroup |
||
| real(kind=rk), | intent(in) | :: | d0 |
Radius of search area: particles closer than this distance will be added to the neighbor list |
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| type(mus_particle_group_type), | intent(inout) | :: | particleGroup |
particleGroup |
||
| type(mus_scheme_type), | intent(inout) | :: | scheme |
Scheme for access to leveldescriptor |
||
| type(mus_geom_type), | intent(in) | :: | geometry |
Geometry for access to tree |
||
| type(mus_param_type), | intent(in) | :: | params |
Params for access to dt, dx, etc. |
||
| real(kind=rk) | :: | Tc |
Collision time |
|||
| real(kind=rk) | :: | eps |
Threshold gap for DEM collisions |
Swap the indices of Fnow and Fnext pointing to the force at the current and next time step respectively
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| type(mus_particle_MEM_type), | intent(inout) | :: | this |
Swap the indices of Fnow and Fnext pointing to the force at the current and next time step respectively
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| type(mus_particle_DPS_type), | intent(inout) | :: | this |
Reset the force at the next time step to 0
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| type(mus_particle_group_type), | intent(inout) | :: | particleGroup |
particleGroup to reset F_DEM(F_DEM_next,:) for |
Reset the force at the next time step to 0
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| type(mus_particle_group_type), | intent(inout) | :: | particleGroup |
particleGroup to reset F_DEM(F_DEM_next,:) for |