Chemical Reactions
==================

Enabling the Chemical Reactions solver and specifying model options.

+----------------------------------+-------------------------------------------------------------+----------+-----------+
|                                  | Description                                                 |   Type   | Default   |
+==================================+=============================================================+==========+===========+
| chemistry.solve                  | Specified name(s) of the chemical reactions types or None   | String   |  None     |
|                                  | to disable the reactions solver.                            |          |           |
+----------------------------------+-------------------------------------------------------------+----------+-----------+

The following inputs are defined using the ``chemistry`` prefix.

+--------------------------+---------------------------------------------------------+----------+----------------+
|                          | Description                                             |   Type   | Default        |
+==========================+=========================================================+==========+================+
| [reaction0].reaction     | Chemical formula for the given reaction. The string     |  String  |  None          |
|                          | given as input must not contain white spaces and        |          |                |
|                          | the reaction direction has to be specified as '-->'     |          |                |
|                          | or '<--'. Chemical species phases must be defined as    |          |                |
|                          | '(g)' for the fluid phase or '(s)' for the solid phase. |          |                |
+--------------------------+---------------------------------------------------------+----------+----------------+
| mass_balance_tolerance   | Tolerance used to test chemical formula conserves mass. | Real     | 1e-12          |
|                          |                                                         |          |                |
|                          |     abs( sum(products) - sum(reactants)) < tolerance    |          |                |
|                          |                                                         |          |                |
+--------------------------+---------------------------------------------------------+----------+----------------+
| solids.update_type       | When updating the solids quantities in chemistry due to |  String  | ConstantVolume |
|                          | chemical reactions, choose the update type among:       |          |                |
|                          |                                                         |          |                |
|                          | * ``ConstantVolume`` keep particles' volume constant    |          |                |
|                          | * ``ConstantDensity`` keep particles' density constant  |          |                |
|                          |                                                         |          |                |
+--------------------------+---------------------------------------------------------+----------+----------------+
| solids.mass_threshold    | Sets a threshold value for the particles' mass. When    | Real     | 0              |
|                          | updating the solids quantities in chemistry, check      |          |                |
|                          | whether the solids mass is below the threshold, and in  |          |                |
|                          | that case set the particle as invalid and remove it     |          |                |
+--------------------------+---------------------------------------------------------+----------+----------------+
| solids.radius_threshold  | Sets a threshold value for the particles' radius. When  | Real     | 0              |
|                          | updating the solids quantities in chemistry, check      |          |                |
|                          | whether the solids radius is below the threshold, and   |          |                |
|                          | in that case set the particle as invalid and remove it  |          |                |
+--------------------------+---------------------------------------------------------+----------+----------------+
| solids.density_threshold | Sets a threshold value for the particles' density. When | Real     | 0              |
|                          | updating the solids quantities in chemistry, check      |          |                |
|                          | whether the solids density is below the threshold, and  |          |                |
|                          | in that case set the particle as invalid and remove it  |          |                |
+--------------------------+---------------------------------------------------------+----------+----------------+

Choosing the integrator type for the chemistry ODE integration operation that is
performed to determine the fluid and solids phases transfer quantities due to
chemical reactions. The ``StiffSolver`` class of integrators is inspired to the
class of integrators in AMReX-Astro/Microphysics
(https://github.com/AMReX-Astro/Microphysics)

+-------------------------+----------------------------------------------------------------------+----------+---------------+
|                         | Description                                                          |   Type   | Default       |
+=========================+======================================================================+==========+===============+
| chemistry.integrator    | Specified name of the chemistry ODE integrator type. Available types | String   | ForwardEuler  |
|                         | are (case insensitive):                                              |          |               |
|                         |                                                                      |          |               |
|                         | * ``ForwardEuler``                                                   |          |               |
|                         | * ``StiffSolver::ForwardEuler``                                      |          |               |
|                         | * ``StiffSolver::BackwardEuler``                                     |          |               |
|                         | * ``StiffSolver::VODE``                                              |          |               |
|                         |                                                                      |          |               |
+-------------------------+----------------------------------------------------------------------+----------+---------------+

One can define the environment variable ``VODE_JACOBIAN_CACHING`` at compile
time to enable caching of the numerical approximation of the Jacobian matrix
(the derivative of the ODE right-hand side), applicable when the VODE integrator
is selected. The following inputs can be specified using the
``chemistry.integrator`` prefix:

+-----------------------+---------------------------------------------------------------------+--------+-----------+
|                       | Description                                                         |   Type | Default   |
+=======================+=====================================================================+========+===========+
| burner_verbose        | Enables the printing on screen of some integration statistics       | int    | 0         |
+-----------------------+---------------------------------------------------------------------+--------+-----------+
| ode_max_steps         | The maximum number of substeps for the ODE integration              | int    | 150000    |
+-----------------------+---------------------------------------------------------------------+--------+-----------+
| jacobian_type         | Select how to compute the jacobian for the ODE iterative            | string | Numerical |
|                       | solver. Available choices are:                                      |        |           |
|                       |                                                                     |        |           |
|                       | * ``Numerical`` for a first-order numerical approximation           |        |           |
|                       | * ``Broyden`` for Broyden's method (only for BackwardEuler)         |        |           |
+-----------------------+---------------------------------------------------------------------+--------+-----------+
| atol                  | Absolute tolerance for the ODE integration error test between       | Real   | 1.e-6     |
|                       | the solution and the fine-step solution                             |        |           |
+-----------------------+---------------------------------------------------------------------+--------+-----------+
| rtol                  | Relative tolerance for the ODE integration error test between       | Real   | 1.e-6     |
|                       | the solution and the fine-step solution                             |        |           |
+-----------------------+---------------------------------------------------------------------+--------+-----------+
| retry_atol            | Overwrites the absolute tolerance value atol in case the ODE        | Real   | -1        |
|                       | integration fails                                                   |        |           |
+-----------------------+---------------------------------------------------------------------+--------+-----------+
| retry_rtol            | Overwrites the relative tolerance value rtol in case the ODE        | Real   | -1        |
|                       | integration fails                                                   |        |           |
+-----------------------+---------------------------------------------------------------------+--------+-----------+
| retry_swap_jacobian   | Swaps the type of jacobian (from 1 to 0 or vice versa) in           | int    | 1         |
|                       | case the ODE integration fails                                      |        |           |
+-----------------------+---------------------------------------------------------------------+--------+-----------+
| ode_max_dt            | Maximum timestep size for the ODE integration substeps              | Real   | 1.e30     |
+-----------------------+---------------------------------------------------------------------+--------+-----------+
| max_dt_change_factor  | Only for StiffSolver::ForwardEuler, sets a maximum factor           | Real   | 1.001     |
|                       | for the change of the timestep for the internal substeps            |        |           |
+-----------------------+---------------------------------------------------------------------+--------+-----------+
| max_iter              | Maximum number of iterations for the internal Newton solver         | int    | 100       |
+-----------------------+---------------------------------------------------------------------+--------+-----------+
| linalg_do_pivoting    | Only for StiffSolver::BackwardEuler and StiffSolver::VODE,          | int    | 1         |
|                       | switches on/off the pivoting when solving the linear algebra        |        |           |
|                       | problem associated to the internal Newton solver                    |        |           |
+-----------------------+---------------------------------------------------------------------+--------+-----------+
| rp_rtol               | Relative tolerance for the convergence test of the internal         | Real   | 1.e-6     |
|                       | Newton solver. Valid only for StiffSolver::BackwardEuler            |        |           |
+-----------------------+---------------------------------------------------------------------+--------+-----------+
| use_jacobian_caching  | Only for StiffSolver::VODE, enables caching the numerical           | int    | 1         |
|                       | jacobian                                                            |        |           |
+-----------------------+---------------------------------------------------------------------+--------+-----------+
| X_reject_buffer       | Only for StiffSolver::VODE, constrain species abundances            | Real   | 1.0       |
|                       | such that they don't change by more than a certain factor in        |        |           |
|                       | a given step                                                        |        |           |
+-----------------------+---------------------------------------------------------------------+--------+-----------+


Below is an example for specifying chemical reactions for MFIX-Exa.

.. code-block:: none

   chemistry.solve = my_reaction0 my_reaction1

   chemistry.my_reaction0.reaction = Fe2O3(s)+CO(g)-->2.FeO(s)+CO2(g)
   chemistry.my_reaction1.reaction = FeO(s)+0.25O2(g)-->0.5Fe2O3(s)

   chemistry.mass_balance_tolerance = 1.e-5

   chemistry.integrator = StiffSolver::BackwardEuler
   chemistry.integrator.atol = 1.e-8
   chemistry.integrator.rtol = 1.e-9