CPA Binding Model Implementation in CADET-Core

A first prototype of the Colloidal Particle Adsorption (CPA) binding model described by Briskot et al. (2021) has now been implemented in CADET-Core.
It is open for testing, and feedback is highly appreciated :blush:.
The detailed set of equations and interface documentation can be found in the feature branch feature/add_CPA_binding_model.

Key Features:

1. Kinetic implementation

The model implements the linear driving force (LDF) formulation for the adsorption kinetics from equation (13) in Briskot et al. (2021):

\frac{\partial c^s_i}{\partial t} = k_{kin}(K_{v,i}c^p_{i} - c^s_i)

2. Variable proton concentration (10^{-pH})

  • The model requires at least two components: one for the proton concentration and at least one component with (exactly) one binding site.
  • The proton concentration is used internally to calculate the pH for the CPA model.
  • Since the proton concentration is a state variable, it is possible to define pH profiles via the inlet and couple pH to reactions or other unit operations.

3. Optional salt component

  • A salt concentration can be defined to represent dynamic ionic strength.
  • If no salt concentration is set, the ionic strength is treated as a model parameter.
  • This enables the simulation of salt gradient elution (see below).

Technical implementation details:

1. Internal Newton solver for surface potential \psi_{0,A}

The adsorber surface potential \psi_{0,A} is solved iteratively using a Newton method to balance the surface charge density:

\sigma_{I,A}(\psi_{0,A}, pH) = \sigma_D(\psi_{0,A}, \kappa)

with

  • solver tolerance: 10^{-15}(1 + |\psi_{0,A}|)
  • max. iterations: configurable via CPA_MAXITER (default = 100)

2. Model parameters Z_i and \Delta_i

The protein charge can vary with pH; a second-order polynomial is implemented to account for this:

Z_i(pH) = Z_{i,ref} + Z_{i,1}(pH - pH_{ref}) + Z_{i,2}(pH - pH_{ref})^2

where Z_{i,ref}, pH_{ref}, Z_{i,1}, and Z_{i,2} are model parameters.

Similarly, we have implemented:

\log_{10}(\Delta_i) = \Delta_{i,ref} + \Delta_{i,1} \left( |\sigma_{I,i}| - \sigma_{I,i,ref} \right)

with the model parameters \Delta_{i,1} and \Delta_{i,ref}.

Current validation results:

1. Briskot (2021) reproductions

This model reproduces:

Calculation files to reproduce these results:
Fig2b.py.zip (3.2 KB)
Fig6.py.zip (3.7 KB)

You can see that although the results are similar to those reported in the paper, they are not identical.
For example, in the isotherm results (Fig. 6, Briskot et al.), the final concentrations of q_{v,i} (or c_i^s ) from the CADET and GoSilico simulations vary by between 0.20 and 0.05 absolute difference, and the salt gradient plot appears slightly smoother.

Open Todos

  • Steady-state implementation: currently only the dynamic/kinetic model is supported
  • CADET-Process support: currently only usable via CADET-Python
  • Polynomial degree for Z_i and \Delta_i: currently limited to quadratic
  • Diffusion coefficient: currently must be provided via the CPA setup, even though it is already defined in the column parameters

So cool ! :rocket:
Can you show how us the differences here as well, so we can see the magnitude and e.g. if its an offset or something else ?

Good point!
I approximated the simulation points from the plots, and calculated the difference between the data points and Cadet and the data points and the approximated simulation points:



Great to see this is finally available! I am excited to try it out! :blush:

Great work, Antonia! We are very excited to try out the new implementation.

Thank you!