Skip to content

Commit

Permalink
Add linear driving force implementations of certain isotherms
Browse files Browse the repository at this point in the history
The following isotherms are added:
- Freundlich LDF
- Multi-component-Langmuir LDF
- Multi-component-Langmuir LDF liquid phase
- Multi-component-Bi-Langmuir LDF

For more information on linear driving force models, refer to the documentation.
  • Loading branch information
jazib-hassan-juelich committed Dec 16, 2022
1 parent cd78214 commit bee06f6
Show file tree
Hide file tree
Showing 23 changed files with 1,640 additions and 17 deletions.
1 change: 0 additions & 1 deletion doc/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,5 +18,4 @@ To build the documentation for all releases and the master branch, run:

`sphinx-multiversion ./ ./build/`.

This documentation is published under https://cadet.github.io
Any changes to the documentation will automatically be pushed to the github-pages repository (https://github.com/cadet/cadet.github.io) using github actions.
6 changes: 3 additions & 3 deletions doc/interface/binding/bi_steric_mass_action.rst
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,9 @@ Bi Steric Mass Action
bound states. Otherwise, the adsorption mode is set for each bound
state separately.

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

``BISMA_KA``
Adsorption rate constants in state-major ordering
Expand Down
52 changes: 52 additions & 0 deletions doc/interface/binding/freundlich_ldf.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
.. _freundlich_ldf_config:

Freundlich LDF
~~~~~~~~~~~~~~~

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


``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
=================== ========================= ==================================

``FLDF_KKIN``
Driving force coefficient for each component


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

=================== ========================= ==================================
**Type:** double **Range:** :math:`\ge 0` **Length:** 1/NTOTALBND
=================== ========================= ==================================


``FLDF_KF``
Freundlich coefficient for each component

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

=================== ========================= ==================================
**Type:** double **Range:** :math:`\ge 0` **Length:** 1/NTOTALBND
=================== ========================= ==================================

``FLDF_N``
Freundlich exponent for each component

**Unit:** :[-]

=================== ========================= ==================================
**Type:** double **Range:** :math:`> 0` **Length:** 1/NTOTALBND
=================== ========================= ==================================






4 changes: 2 additions & 2 deletions doc/interface/binding/multi_component_bi_langmuir.rst
Original file line number Diff line number Diff line change
Expand Up @@ -13,11 +13,11 @@ Multi Component Bi-Langmuir
state separately.

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

``MCBL_KA``
Adsorption rate constants in state-major ordering
Adsorption rate constants in state-major ordering (see :ref:`ordering_multi_dimensional_data`)

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

Expand Down
44 changes: 44 additions & 0 deletions doc/interface/binding/multi_component_bi_langmuir_ldf.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
.. _multi_component_bi_langmuir_ldf_config:

Multi Component Bi-Langmuir LDF
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

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


``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
=================== ========================= =========================================

``MCBLLDF_KEQ``
Equillibrium loading constants in state-major ordering (see :ref:`ordering_multi_dimensional_data`)

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

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

``MCBLLDF_KKIN``
Linear driving force coefficients in state-major ordering

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

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

``MCBLLDF_QMAX``
Maximum adsorption capacities in state-major ordering

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

=================== ========================= =========================================
**Type:** double **Range:** :math:`\gt 0` **Length:** NCOMP :math:`\cdot` NSTATES
=================== ========================= =========================================
44 changes: 44 additions & 0 deletions doc/interface/binding/multi_component_langmuir_ldf.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
.. _multi_component_langmuir_ldf_config:

Multi Component Langmuir LDF
============================

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


``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
=================== ========================= =========================================

``MCLLDF_KEQ``
Equillibrium loading constants

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

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

``MCLLDF_KKIN``
Linear driving force coefficients

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

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

``MCLLDF_QMAX``
Maximum adsorption capacities

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

=================== ========================= ==================================
**Type:** double **Range:** :math:`\gt 0` **Length:** NCOMP
=================== ========================= ==================================
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
.. _multi_component_langmuir_ldf_liquid_phase_config:

Multi Component Langmuir LDF Liquid Phase
==========================================

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


``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
=================== ========================= =========================================

``MCLLDFC_KEQ``
Equillibrium loading constants

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

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

``MCLLDFC_KKIN``
Linear driving force coefficients

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

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

``MCLLDFC_QMAX``
Maximum adsorption capacities

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

=================== ========================= ==================================
**Type:** double **Range:** :math:`\gt 0` **Length:** NCOMP
=================== ========================= ==================================
16 changes: 12 additions & 4 deletions doc/interface/introduction.rst
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,7 @@ Common notation and identifiers that are used in the subsequent description are
* - PARAM_VALUE
- Value of a generic unspecified parameter

.. _ordering_multi_dimensional_data:

Ordering of multi dimensional data
----------------------------------
Expand All @@ -85,14 +86,21 @@ Some model parameters, especially in certain binding models, require multi dimen
Since CADET only reads one dimensional arrays, the layout of the data has to be specified (i.e., the way how the data is linearized in memory).
The term “*xyz*-major” means that the index corresponding to *xyz* changes the slowest.

For instance, suppose a model with :math:`2` components and :math:`3` bound states has a “component-major” dataset.
Then, the requested matrix is stored in memory such that all bound states are listed for each component (i.e., the component index changes the slowest and the bound state index the fastest):
For instance, suppose a model with :math:`2` components and :math:`3` bound states has a “state-major” dataset.
Then, the requested matrix is stored in memory such that all components are listed for each bound state (i.e., the bound state index changes the slowest and the component index the fastest):

::

comp0bnd0, comp0bnd1, comp0bnd2, comp1bnd0, comp1bnd1, comp1bnd2.
comp0bnd0, comp1bnd0, comp0bnd1, comp1bnd1, comp0bnd2, comp1bnd2

This linear array can be represented as a :math:`2 \times 3` matrix in “row-major” storage format, or a :math:`3 \times 2` matrix in “column-major” ordering.

This linear array can also be represented as a :math:`3 \times 2` matrix in “row-major” storage format:

::

comp0bnd0, comp1bnd0
comp0bnd1, comp1bnd1
comp0bnd2, comp1bnd2


.. _section_dependent_parameters:
Expand Down
39 changes: 39 additions & 0 deletions doc/literature.bib
Original file line number Diff line number Diff line change
Expand Up @@ -374,4 +374,43 @@ @article{Huuk2017
url = {http://doi.wiley.com/10.1002/biot.201600336},
volume = {12},
year = {2017}
}
@article{Alpay1992,
title = {The linear driving force model for fast-cycle adsorption and desorption in a spherical particle},
journal = {Chemical Engineering Science},
volume = {47},
number = {2},
pages = {499-502},
year = {1992},
issn = {0009-2509},
doi = {https://doi.org/10.1016/0009-2509(92)80041-A},
url = {https://www.sciencedirect.com/science/article/pii/000925099280041A},
author = {E. Alpay and D.M. Scott}
}
@incollection{Singh2016,
title = {Chapter 8 - Nanoparticle Ecotoxicology},
editor = {Ashok K. Singh},
booktitle = {Engineered Nanoparticles},
publisher = {Academic Press},
address = {Boston},
pages = {343-450},
year = {2016},
isbn = {978-0-12-801406-6},
doi = {https://doi.org/10.1016/B978-0-12-801406-6.00008-X},
url = {https://www.sciencedirect.com/science/article/pii/B978012801406600008X},
author = {Ashok K. Singh},
keywords = {Anthropogenic sphere, Atmosphere, Biosphere, Climate, Environment, Fate of nanoparticles, Human activity, Hydrosphere, Lithosphere, Man made, Nanoparticles, Nanotoxicology, Natural},
abstract = {Although the physicochemical and beneficial properties of nanoparticles have drawn widespread attention in recent years, their potential for causing environmental damage and ecological toxicity (ecotoxicity) is not fully understood. This chapter provides contemporary information regarding characteristics of the environment (atmosphere, hydrosphere, lithosphere, and biosphere), distribution of bulk and nanoparticles in different spheres, fate of nanoparticles (in air, water, and soil), and adverse effects of different groups of nanoparticles on various types of ecosystems. Although many nanoparticles have been shown to cause potent ecological damage, the results from studies often differ, possibly due to heterogeneity in the physical properties of nanoparticles and the environment, the species and habitat differences, nanoparticles' unique electronic and chemical properties, differences in biomarkers used, and presence of toxins and other contaminants associated with the nanoparticle that may modulate its toxicity. Elucidating these issues may represent a critical future research direction to establish the safe use of nanoparticles.}
}
@article{Benedikt2019,
author = {Aumeier, Benedikt M. and Dang, Anh H. Q. and Ohs, Burkhard and Yüce, Süleyman and Wessling, Matthias},
title = {Aqueous-Phase Temperature Swing Adsorption for Pesticide Removal},
journal = {Environmental Science \& Technology},
volume = {53},
number = {2},
pages = {919-927},
year = {2019},
doi = {10.1021/acs.est.8b05873},
URL = { https://doi.org/10.1021/acs.est.8b05873},
eprint = { https://doi.org/10.1021/acs.est.8b05873}
}
44 changes: 44 additions & 0 deletions doc/modelling/binding/freundlich_ldf.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
.. _freundlich_ldf_model:

Freundlich LDF
~~~~~~~~~~~~~~~

The Freundlich isotherm model is an empirical model that considers changes in the equilibrium constant of the binding process due to the heterogeneity of the surface and the variation of the interaction strength :cite:`Benedikt2019,Singh2016`.
This variant of the model is based on the linear driving force approximation (see section :ref:`ldf_model`) and is given as

.. math::
\begin{aligned}
q^*_i= k_{F,i}c_{p,i}^{\frac{1}{n_{i}}} && i = 0, \dots, N_{\text{comp}} - 1.
\end{aligned}
No interaction between the components is considered when the model has multiple components.
One of the limitation of this isotherm is the first order Jacobian :math:`\left(\frac{dq^*}{dc_p}\right)` tends to infinity as :math:`c_{p} \rightarrow 0` for :math:`n>1`.
To address this issue an approximation of isotherm is considered near the origin.
This approximation matches the isotherm in such a way that :math:`q=0` at :math:`c_p=0` and also matches the first derivative of the istotherm at :math:`c_p = \epsilon`, where :math:`\epsilon` is a very small number, for example :math:`1e-14`.
The form of approximation and its derivative is given below for :math:`c_p < \varepsilon` and :math:`n>1`:

.. math::
\begin{aligned}
q^* = \alpha_0+\alpha_1 c+\alpha_2 c_p^2
\end{aligned}
\begin{aligned}
\frac{dq^*}{dc_p} = \alpha_1+ 2 \alpha_2 c_p
\end{aligned}
where :math:`\alpha_0=0` and :math:`\alpha_1` and :math:`\alpha_2` are determined from :math:`\alpha_1 \varepsilon+\alpha_2 \varepsilon^2 = k_f \varepsilon^{1/n}` and :math:`\alpha_1 + 2 \alpha_2 \varepsilon = \frac{1}{n}k_f \varepsilon^{\frac{1-n}{n}}`.

.. math::
\begin{aligned}
\alpha_1 = \frac{2 n-1}{n}k_f \varepsilon^{\frac{1-n}{n}}
\end{aligned}
.. math::
\begin{aligned}
\alpha_2 = \frac{1-n}{n}k_f \varepsilon^{\frac{1-2 n}{n}}
\end{aligned}
This approximation can be used for any pore phase cocentration :math:`c_p < \epsilon` given :math:`n>1`.
For the case, when :math:`n \le 1` no special treament near the origin is required.
For more information on model parameters required to define in CADET file format, see :ref:`freundlich_ldf_config`.

Loading

0 comments on commit bee06f6

Please sign in to comment.