Skip to content

The Model

Mk-learning-python07 edited this page Sep 16, 2026 · 2 revisions

The model

The balances follow Ruthven (1984); the dynamic-column-breakthrough framing follows Wilkins, Rajendran & Farooq (2021). The equations below are what the solver actually integrates, in dimensionless form, with

$$Z = z/L, \quad \tau = t,v_0/L, \quad P \equiv P/P_0, \quad T \equiv T/T_0, \quad v \equiv v/v_0, \quad x_i = q_i/q_{s,0}$$

Governing equations

Component 1, gas phase

$$\frac{\partial y_1}{\partial\tau}=\frac{T}{Pe_a P}\frac{\partial}{\partial Z}\left(\frac{P}{T}\frac{\partial y_1}{\partial Z}\right)-\frac{T}{P}\frac{\partial}{\partial Z}\left(\frac{y_1 P v}{T}\right)-\psi\frac{T}{P}\frac{\partial x_1}{\partial\tau}-\frac{y_1}{P}\frac{\partial P}{\partial\tau}+\frac{y_1}{T}\frac{\partial T}{\partial\tau}$$

Overall mass (total pressure)

$$\mathcal{R}_P=-T\frac{\partial}{\partial Z}\left(\frac{Pv}{T}\right)-\psi T\left(\frac{\partial x_1}{\partial\tau}+\frac{\partial x_2}{\partial\tau}\right)$$

Column energy

$$\mathcal{R}_T=\omega_1\frac{\partial^2 T}{\partial Z^2}-\omega_2\frac{\partial (Pv)}{\partial Z}-\omega_3 T\left(\frac{\partial x_1}{\partial\tau}+\frac{\partial x_2}{\partial\tau}\right)+\sigma_1\frac{\partial x_1}{\partial\tau}+\sigma_2\frac{\partial x_2}{\partial\tau}-\omega_4\left(T-T_w\right)$$

Pressure–temperature decoupling. The two balances above share the same time derivatives, so they are solved simultaneously at each step:

$$\frac{\partial P}{\partial\tau}=\frac{\mathcal{R}_P+(P/T)\mathcal{R}_T}{1+P\omega_2/T},\qquad \frac{\partial T}{\partial\tau}=\frac{\mathcal{R}_T-\omega_2\mathcal{R}_P}{1+P\omega_2/T}$$

Wall energy

$$\frac{\partial T_w}{\partial\tau}=\pi_1\frac{\partial^2 T_w}{\partial Z^2}+\pi_2\left(T-T_w\right)-\pi_3\left(T_w-T_{amb}\right)$$

Mass transfer (linear driving force)

$$\frac{\partial x_i}{\partial\tau}=K_i\frac{L}{v_0}\left(x_i^{\ast}-x_i\right)$$

Momentum (Ergun)

$$A,v+B,v\left|v\right|=-\frac{\partial P}{\partial Z}$$

Dimensionless groups

Every group is formed from the run's own inputs and reported per run in the Computed Params tab. $\Lambda$ is the shared volumetric heat capacity of the column energy balance:

$$\Lambda=\rho_s C_{p,s}+\rho_s C_{p,ads},q_{s,0}\left(x_1+x_2\right)$$

Group Definition Meaning
$\psi$ $\dfrac{R T_0\rho_s q_{s,0}}{P_0}\dfrac{1-\varepsilon}{\varepsilon}$ Adsorbed-phase coupling: converts solid uptake into the equivalent gas-phase mole change
$Pe_a$ $\dfrac{v_0 L}{D_L}$, $D_L=0.7D_m+0.5v_0 d_p$ Axial mass Péclet number; strength of the dispersion term, evaluated per cell
$Pe_h$ $\dfrac{\varepsilon v_0 L C_{p,gas}}{k_z}\dfrac{P}{T}$ Axial thermal Péclet number, used in the inlet half-cell temperature boundary condition
$\omega_1$ $\dfrac{k_z}{(1-\varepsilon)v_0 L,\Lambda}$ Axial conduction through the bed
$\omega_2$ $\dfrac{C_{p,gas}P_0}{R T_0}\dfrac{\varepsilon}{1-\varepsilon}\dfrac{1}{\Lambda}$ Compression and convective enthalpy carried by the flowing gas
$\omega_3$ $\dfrac{C_{p,ads}q_{s,0}\rho_s}{\Lambda}$ Sensible heat of the adsorbed phase as loading changes
$\omega_4$ $\dfrac{2h_{in}L}{r_{in}v_0(1-\varepsilon)\Lambda}$ Bed-to-wall heat transfer
$\sigma_i$ $-\dfrac{\Delta H_i,q_{s,0}\rho_s}{T_0,\Lambda}$ Heat of adsorption of component $i$; negative $\Delta H_i$ gives an exotherm on adsorption
$\pi_1$ $\dfrac{k_w}{\rho_w C_{p,w}v_0 L}$ Axial conduction along the wall
$\pi_2$ $\dfrac{2r_{in}h_{in}L}{(r_{out}^2-r_{in}^2)\rho_w C_{p,w}v_0}$ Bed-to-wall transfer as seen by the wall
$\pi_3$ $\dfrac{2r_{out}h_{out}L}{(r_{out}^2-r_{in}^2)\rho_w C_{p,w}v_0}$ Wall-to-ambient loss; with $\pi_2$ this sets the thermal time constant

Gas heat capacities use Shomate polynomials per species. All heat capacities are on a molar basis ($C_{p,gas}$, $C_{p,ads}$ in J/mol·K); a mass-basis value entered by mistake will be rejected or will give obviously wrong thermal behaviour.

Momentum balance

Ergun by default — viscous (Blake–Kozeny) plus inertial (Burke–Plummer). The inertial term can be switched off to give pure Darcy, $v = -A^{-1}\partial P/\partial Z$.

Darcy is not merely a simplification here: it removes the need for solver inequality constraints and runs about 3.4× faster, and for conditions where the inertial term is genuinely negligible the two agree to solver tolerance. Run Darcy first, compare, and switch to Ergun when the flow warrants it.

Numerics

  • Discretisation: finite volume, $N$ cells, WENO reconstruction at cell faces.
  • System: $6N$ coupled ODEs.
  • Integrator: SUNDIALS CVODE (implicit BDF) through scikit-sundae, with a sparse SuperLU_MT linear solver and an explicitly supplied Jacobian sparsity pattern.
  • Limits enforced by the backend: $N_{grid} \in [5, 100]$, $t_{run} \in [1, 10^6]$ s, two concurrent solves, 900 s wall-clock cap per solve.

Grid resolution is a genuine trade-off: coarse grids smear the front, fine grids cost time. Start at the default $N=30$ and refine until the breakthrough time stops moving.

How results are checked

The engine ships with a self-test covering 97 checks — isotherm limiting behaviour, IAST consistency, heat-of-adsorption signs, dimensionless group formation, mass and energy closure, enumeration integrity. All 97 pass for the published build.

Beyond that, the default Zeolite 13X case reproduces the validated experiment of Wilkins & Rajendran (2019), and the mass balance is reported against two independent references on every run so a silently wrong answer has to defeat both.


Wiki: Home · The Model · Isotherm Models · Mass Transfer · Adsorbent Presets · Using the App · Limitations · Privacy & Security · Troubleshooting

Clone this wiki locally