cadet / CADET-Core

A modular, fast, and accurate simulation framework for (bio)chemical processes
Other
65 stars 26 forks source link

Add Multicomponent Freundlich LDF isotherm. #259

Open ronald-jaepel opened 3 months ago

ronald-jaepel commented 3 months ago

This PR continues work by @sleweke to add the multicomponent Freundlich isotherm to CADET-Core.

I've rebased the branch onto master.

Status and ToDos:

The Freundlich isotherm works in all tests configurations I threw at it (both components c_p > 1, cp == 0 and cp < 0).

ronald-jaepel commented 3 months ago

For reference, here's the current state of the documentation.

A multi-component extension to the classical Freundlich adsorption model. A linear driving force approach is applied to obtain a kinetic form.

$$$
\begin{aligned} \frac{\mathrm{d} qi}{\mathrm{d} t} &= k{\text{ldf},i} \left(q_i^ - qi \right) & i = 0, \dots, N{\text{comp}} - 1 \ q_i^ &= k{f,i} c{p,i} \left( \sumj a{ij} c_{p,j} + \tau \right)^{n_i - 1}. \end{aligned} $$$

Here, $\tau > 0$ is a small constant that ensures numerical stability. In a rapid-equilibrium setting with a diagonal matrix (i.e., $a{ii} = 1$ and $a{ij} = 0$ for $j \neq i$), the traditional Freundlich isotherm is recovered.

For more information on model parameters required to define in CADET file format, see :ref:multi_component_ldf_freundlich_config.

Multi Component Linear Driving Force Freundlich
===============================================

**Group /input/model/unit_XXX/adsorption – ADSORPTION_MODEL = MULTI_COMPONENT_LDF_FREUNDLICH**

``IS_KINETIC``
   Selects kinetic or quasi-stationary adsorption mode: 1 = kinetic, 0 =
   quasi-stationary. If a single value is given, the mode is set for all
   bound states. Otherwise, the adsorption mode is set for each bound
   state separately.

===================  =========================  =========================================
**Type:** int        **Range:** {0,1}           **Length:** 1/NTOTALBND
===================  =========================  =========================================

``MCLDFFRL_KLDF``
   Rate constants in linear driving force approach

**Unit:** :math:`s^{-1}`

===================  =========================  =========================================
**Type:** double     **Range:** :math:`\ge 0`   **Length:** NCOMP
===================  =========================  =========================================

``MCLDFFRL_KF``
   Proportionality constants

**Unit:** :math:`m_{MP}^{3}~m_{SP}^{-3}`

===================  =========================  ==================================
**Type:** double     **Range:** :math:`\ge 0`   **Length:** NCOMP
===================  =========================  ================================== 

``MCLDFFRL_EXP``
   Freundlich exponent

===================  =========================  ==================================
**Type:** double     **Range:** :math:`\gt 0`   **Length:** NCOMP
===================  =========================  ================================== 

``MCLDFFRL_A``
   Component influences in row-major ordering

**Unit:** :math:`m_{MP}^{3}~mol^{-1}`

===================  =========================  ==================================
**Type:** double     **Range:** :math:`\ge 0`   **Length:** :math:`\text{NCOMP}^2`
===================  =========================  ================================== 

``MCLDFFRL_TAU``
   Small constant that ensures numerical stability

===================  =========================  =========================================
**Type:** double     **Range:** :math:`\gt 0`   **Length:** 1
===================  =========================  =========================================
ronald-jaepel commented 1 month ago

I got some comments from collaborators, so this PR will need work before it can be merged. I can take care of it after my return but I'll also forward you the email. Can't do much more from my phone atm.