# Time stepping

There are several ways that the inputs are used to determine the time step of particle-only, fluid-only, and coupled fluid-particle systems.

Fluid-only simulations

In fluid-only simulations, setting `mfix.fixed_dt` causes the fluid to advance with a fixed (constant) time step. If `mfix.fixed_dt` is not defined, then an appropriate time step is computed based on the advective CFL condition.

Caution

The adaptive time step based on the advective CFL condition is always computed and is strongly recommended for most cases.

- For a fixed time step simiulation, if the computed step size is smaller than `mfix.fixed_dt` for a fixed, the simulation aborts with the message:

      amrex::Abort::0::"Fixed dt is too large for fluid solve !!!

- For simulations using the adaptive time step:

  - If the computed time step is larger than `mfix.dt_max`, then the time step is set to `dt_max`

  - If the computed time step is smaller than `mfix.dt_min`, then the simulation aborts with the message:

        amrex::Abort::0::"Current dt is smaller than dt_min !!!

Particle-only DEM simulations

In particle-only DEM simulations, the time step used to advance particles, `dtsolid`, is determined by computing the collision time `tcoll` from particle properties, then dividing the result by the number of steps per collision, `tcoll_ratio`:

    dtsolid = tcoll / tcoll_ratio;

Note

`mfix.fixed_dt` must be defined for particle-only DEM simulations, however it is only used to determine the frequency of outputs and has no effect on the particle advance. If a positive value is not specified for `mfix.fixed_dt`, then the solver aborts with the following message:

    amrex::abort::0::if running particle-only must specify fixed_dt in the inputs file !!!

Coupled fluid-DEM simulations

In a coupled fluid-DEM simulation, the fluid time step, `dt`, and the particle time step, `dtsolid`, are computed the same as in fluid-only and DEM-only simulations, respectively. If `dt < dtsolid`, then the particle sub-time step, `subdt`, is set to the fluid time step and one particle advance is taken. However, if `dt > dtsolid` (which is usually the case), then the number of sub-steps needed for DEM particles to advance the same total time as the fluid, `nsubsteps`, is computed by dividing `dt` by `dtsolid` and the particle sub-time step is computed by dividing `dt` by `nsubsteps`.

    int nsubsteps = 1;
    amrex::Real subdt = dt;

    if (dt > dtsolid) {
     nsubsteps = amrex::Math::ceil(dt / dtsolid);
     subdt = dt / nsubsteps;
    }

The following inputs are defined using the prefix `mfix`:

Key | Description | Type | Default
--- | --- | --- | ---
max_step | Maximum number of time steps to take | Int | -1
stop_time | Maximum time to reach (s) | Real | -1.0
fixed_dt | Use a fixed time step | Int | 0
cfl | CFL constraint (dt < cfl * dx / u) Defaults to 0.5 if `mfix.advection_type = MOL` Defaults to 0.9 if `mfix.advection_type = Godunov` ignored if `mfix.fixed_dt = 1` | Real | See note
dt_min | Abort if `dt` gets smaller than this value | Real | 1.e-6
dt_max | Maximum value of `dt` if `fixed_dt` is not set | Real | 1.e14
tcoll_ratio | DEM time step equals the min collision time divided by this value | Real | 50.0
walltime_limit | Runtime limit specified with format HH:MM:SS. When the runtime has almost reached the limit (approaching is computed by considering the average runtime needed for each step), then the simulation ends and a clean exit is performed | String | “”
clean_exit | The name of a file that, if found in the run folder, makes the solver stop and perform a clean exit. | String | “”

In the case of unsteady flow, the simulation will stop when either the number of steps reaches `max_step` or time reaches `stop_time`.

The following inputs are defined using the prefix `mfix` and are only relevant if running a steady state simulation.

Key | Description | Type | Default
--- | --- | --- | ---
steady_state | Run a steady-state calculation. | Int | 0
steady_state_tol | Tolerance for checking if steady state has been reached. (Must be set if steady_state is enabled) | Real | None
steady_state_maxiter | Maximum number of allowed iterations to converge to steady state | Int | 100000000