Multi-component colloidal model implementation in CADET


I had a query about the implementation of the colloidal isotherm with multiple adsorbing components.

I don’t think this model is included in the documentation, so I took at look at the github file (link at the bottom). I found this comment describing the implementation of the isotherm:

 * @brief Defines the multi component colloidal binding model
 * @details Implements the colloidal adsorption model: \f[ \begin{align} 
 *              \frac{\mathrm{d}q_i}{\mathrm{d}t} &= k_{a,i} c_{p,i} q_{\text{max},i} \left( 1 - \sum_j \frac{q_j}{q_{\text{max},j}} \right) - k_{d,i} q_i
 *          \end{align} \f]
 *          Multiple bound states are not supported. 
 *          Components without bound state (i.e., non-binding components) are supported.
 *          The first component (index @c 0) is salt, the second component (index @c 1)
 *          can be pH. Both components have to be non-binding.
 * @tparam ParamHandler_t Type that can add support for external function dependence

For convenience, here’s the equation that the above comment describes:

How is the q_{max},i term obtained (for each i) when there are multiple bound species? How is the species interaction implemented?

I think I see some description of that in lines below, but it’s hard for me to interpret what’s going on. Any help would be appreciated. :slight_smile:

// dres_i / dc_{p,0} (salt)
				jac[0 - bndIdx - offsetCp] = kKinKeq * (-logKeq_dSalt) * y[bndIdx];

				// dres_i / dc_{p,i}
				jac[i - bndIdx - offsetCp] = -static_cast<double>(p->kKin[i]);

				// dres_i / dq_i
				jac[0] = kKinKeq;

				// Advance to next flux and Jacobian row

Thank you!

You probably have noticed, the descriptions and the equation you posted are for the Langmuir isotherm. Because the colloidal isotherm is implemented in a feature branch, so I guess these details are not updated yet.

The code you posted here are the Jacobians (jac) which are used to reduce computational burdens, you can safely ignore these and look at the residual (res) implementations.

Back to your questions, I’m not entirely sure what you mean when you say ‘species interactions’, if there are equations or relationships to quantify this, maybe posting it here would help people understand it.

With that being said, you can also look at line 278-296. This part considers the possible ‘interactions’ you mentioned as it’s iterating over other components. Line 292:
S_i += y[bndIdx2] * sqrt(bpp_i * bpp_j) * radSum * exp(-kappa * (R - radSum));
the bpp and radSum term depend on the current component i and the other component j.

Hope it helps,

Hey Soumi,

See below for a word doc someone gave me 2 years ago with the documentation of multicomponent colloidal. The equations are taken from Xu and Lenhoff 2008, see below link.

Colloidal Multicomponent_equ.docx (21.1 KB)

1 Like

Thanks Scott and @Flynn.

Yes, I was confused by that equation under the comment Implements the colloidal adsorption model:.

I wanted to confirm whether the multicomponent system incorporates the pairwise repulsive (Bpp driven) interactions (as described in the original Xu/Lenhoff paper which Scott points to) - thank you for clarifying that it does!


1 Like

Be aware that this isotherm is undocumented for good reasons: the symbolic Jacobian is not implemented, and the code is not fully tested. You can of course use the model, but be careful.


While we’re on this topic, something I was curious about was comparing the colloidal formalism in CADET with the colloidal particle adsorption (CPA) isotherm Some of the terms have different names but overall the two models have many similarities. I am curious about comparing these two, as I don’t think this has been done by anyone yet.

Yes, this would indeed be a very interesting study. After Ron has unified different HIC isotherms, it would be great to attempt the same with the colloidal models. We certainly have that on our to do list.

1 Like