.. sec:InputsTimeStepping:

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.

.. rubric:: 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:

    .. highlight:: c++

    ::

        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:

      .. highlight:: c++

      ::

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

.. rubric:: 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``:

.. highlight:: c++

::

    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 code aborts with the
  following message:

  .. highlight:: c++

  ::

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


.. rubric:: 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``.

.. highlight:: c++

::

    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 ``mfix`` prefix.

+----------------------+-----------------------------------------------------------------------+-------------+--------------+
| 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             | Flag to use a fixed time step                                         |    Int      |   0          |
+----------------------+-----------------------------------------------------------------------+-------------+--------------+
| cfl                  | CFL constraint (dt < cfl * dx / u)                                    |    Real     |  See note    |
|                      |                                                                       |             |              |
|                      | * Defaults to 0.5 if ``mfix.advection_type = MOL``                    |             |              |
|                      | * Defaults to 0.9 if ``mfix.advection_type = Godunov``                |             |              |
|                      | * ignored if ``mfix.fixed_dt = 1``                                    |             |              |
+----------------------+-----------------------------------------------------------------------+-------------+--------------+
| 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 1                      |    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    |    String   |   ""         |
|                      | 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                                             |             |              |
+----------------------+-----------------------------------------------------------------------+-------------+--------------+
| clean_exit           | This input represents the name of a file that, if found in the run    |    String   |   ""         |
|                      | folder, makes the code stop and perform a clean exit                  |             |              |
+----------------------+-----------------------------------------------------------------------+-------------+--------------+
| init_shrink          | Factor by which ``dt`` is shrunk in the initial iterations and step   |    Real     |  1.0         |
+----------------------+-----------------------------------------------------------------------+-------------+--------------+

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 ``mfix`` prefix and are only relevant if running a steady state simulation.

+-----------------------+-----------------------------------------------------------------------+-------------+------------+
| Key                   | Description                                                           |   Type      | Default    |
+=======================+=======================================================================+=============+============+
| steady_state          | Are we running a steady-state calculation?                            |   Int       | 0          |
+-----------------------+-----------------------------------------------------------------------+-------------+------------+
| steady_state_tol      | Tolerance for checking if we have reached steady state                |   Real      | None       |
|                       |                                                                       |             |            |
|                       | (Must be set if steady_state = 1)                                     |             |            |
+-----------------------+-----------------------------------------------------------------------+-------------+------------+
| steady_state_maxiter  | Maximum number of allowed iterations to converge to steady state      |   Int       | 100000000  |
+-----------------------+-----------------------------------------------------------------------+-------------+------------+



