A macroscopic Eulerian solver for tracking the evolution of non-spherical oblate ellipsoidal particle populations using the Conditional Quadrature Method of Moments (CQMOM). Developed as part of the M.Sc. thesis of Mohamed Amine Bouguezzoul with the title "Conditional Quadrature Method of Moments for Populations of Non-Spherical Particles" at Polytechnique Montréal (2026), supervised by Bruno Blais, Bianca Viggiano, and Fabian Denner.
For a hands-on introduction to the Quadrature Method of Moments (QMOM), check out the QMOM-Intro repository.
Simulating dispersed multiphase flows containing non-spherical particles requires solving a Population Balance Equation (PBE) over a high-dimensional phase space. Conventional bin-based discretization is computationally intractable at 5D — requiring millions of scalars per CFD cell. This framework bypasses that bottleneck by tracking a small set of statistical moments of the Number Density Function (NDF) instead of the full distribution.
The state space is 5-dimensional:
| Symbol | Description |
|---|---|
| Volume-equivalent diameter | |
| Aspect ratio (oblate spheroid) | |
| Translational velocity components |
- Generic N-dimensional CQMOM — recursive conditional moment inversion via the adaptive Wheeler algorithm, supporting arbitrary phase-space dimensionality
- Hybrid Transport (HT) — symmetric Strang-splitting architecture that decouples continuous aerodynamic advection from discontinuous breakage, preserving Hankel matrix positive-definiteness
- Moment Transport (MT) — fully coupled explicit SSP-RK3 solver, provided as a comparison baseline
- Monte Carlo (MC) benchmark — Lagrangian stochastic reference for validation
- Shape-dependent drag — oblate spheroid drag correlations (Ouchene 2020) under the quasi-steady orientation (QSO) assumption
-
Surface attrition — kinetic-energy-driven
$v^2$ -attrition and continuous spheroidization - Stochastic breakage recoil — isotropic velocity kick with analytically closed Gaussian moment expectations
- Gaussian copula mixture initializer — supports lognormal, beta, and normal marginals with arbitrary correlation structure
- Adaptive time-stepping — SSP-RK3 with embedded error estimator and time-step adaptation
├── CQMOM/ # CQMOM folder
│ ├── tools/ # Inventory of tools
│ │ ├── CQMOM.py # Wheeler algorithm + N-dimensional CQMOM inversion
│ │ ├── flux_calculator.py # Algorithm to compute the phase-space fluxes
│ │ ├── initial_NDF.py # Gaussian copula mixture initializer
│ │ └── ssp_rk_solver.py # SSP-RK3 time integrator and adaptive step controller
│ │
│ ├── Config.py # Central configuration — all tuneable parameters
│ ├── CQMOM-Generic.ipynb # Simulation notebook for CQMOM in any dimension
│ ├── CQMOM-MTvsHTvsMC.ipynb # Comparative analysis: MT vs HT vs MC
│ └── Media # Where media files are stored
│
└── QSO-Assumption # QSO folder
├── QSO-Notebook.ipynb # Testing the quasi-steady orientation assumption
└── Media # Where media files are stored
pip install numpy scipy matplotlib jupyterOpen and run the CQMOM-MTvsHTvsMC.ipynb notebook. All physical, numerical, and plotting parameters are controlled centrally through Config.py — no hard-coded constants exist in the notebooks.
The configuration is organized into sections:
| Section | Key Parameters |
|---|---|
simulation |
dim, time_step, simulation_time, num_particles |
initial_conditions |
N (nodes per dim), moments_idx |
mixture |
mixture_weights, dim_types, per-mode means/stds |
physics |
rho_p, rho_f, mu_f, g |
breakage |
frag_rate_const, frag_power, min_frag_size |
attrition |
tau_relax, attrition_rate_const |
restitution |
restitution_factor, sigma_kick |
fluid_forcing |
freq, u_amp, v_amp, w_amp |
cqmom |
rcond_ht, rcond_mt, rmin, eabs, cutoff |
A timestamped output folder with a JSON config snapshot and plain-text summary is automatically created on each run.
The multivariate inversion follows a hierarchical chain:
-
Primary inversion — Wheeler algorithm on marginal moments
$M_{k,0,\ldots,0}$ - Conditional inversion — Vandermonde system solved via pseudoinverse to extract conditional moments at each primary node
- Recursion — repeated for each subsequent dimension, conditioning on all prior nodes
The adaptive Wheeler algorithm monitors diagonal elements of the sigma table and dynamically reduces quadrature order to prevent singularity when distributions become nearly monodisperse.
The MT method advances the full moment tensor
The corresponding MTE is:
where the advection flux
When competing continuous and discontinuous fluxes are processed simultaneously, the Hankel matrices become severely ill-conditioned, forcing the adaptive Wheeler algorithm into localized low-order fallbacks that corrupt kinematic variance and geometric mass conservation. The MT solver is retained as a diagnostic baseline: its failure modes directly quantify the mathematical stiffness that the HT architecture is designed to circumvent.
The HT method advances the full moment tensor
-
Half-step advection — integrate physical ODEs for
$\Delta t/2$ , reconstruct moments from advected nodes - Full-step breakage — update moments via SSP-RK3 under the isolated breakage source term
- CQMOM inversion — reconstruct nodes from fragmented moments
-
Half-step advection — integrate remaining
$\Delta t/2$ , reconstruct final moments
This architecture isolates the expensive matrix inversion to a single evaluation per time step, achieving (in our experience) a 28–52× speedup over the MT approach.
Strong Stability Preserving third-order Runge–Kutta scheme with an embedded second-order error estimate for adaptive time-stepping. The SSP property prevents numerical dispersion from pushing the moment set outside the realizable space.
Under the quasi-steady orientation (QSO) assumption — justified by a time-scale analysis showing
Power-law rate kernel:
Volume-conserving binary split:
Stochastic recoil velocity:
The Gaussian moment expectation for the recoil is analytically closed inside the CQMOM fluxes — no random sampling is required.
Three test cases of increasing complexity are provided in the notebook CQMOM-MTvsHTvsMC.ipynb:
| Test Case | Physics Active |
|---|---|
| Monomodal settling | Drag + binary breakage |
| Multimodal settling | Drag + binary breakage + velocity recoil |
| Multimodal jets / fully coupled swirling flow | Drag + attrition + breakage + recoil |
For the first and second test case, you might consider editing the discontinuous source term for
$\chi$ so that:$\chi _\text{daughter} = \alpha \chi _\text{parent} + (1-\alpha) $ .
All CQMOM results are validated against Monte Carlo simulations tracking
| Metric | Monte Carlo | HT | MT |
|---|---|---|---|
| Geometric fidelity | ✅ Reference | ✅ Excellent | |
| Granular temperature | ✅ Reference | ✅ Good | ❌ Severe collapses |
| Realizability | ✅ Always | ✅ Maintained | ❌ Hankel matrix failures |
| Runtime (monomodal) | 25 s | 2.5 s | 70 s |
| Runtime (fully coupled) | 27 s | 3 s | 156 s |
If you use this code in your research, please cite:
@mastersthesis{Bouguezzoul2026,
author = {Mohamed Amine Bouguezzoul},
title = {Conditional Quadrature Method of Moments for Populations
of Non-Spherical Particles},
school = {Polytechnique Montréal},
year = {2026},
month = {May},
}This work was supported by the Natural Sciences and Engineering Research Council of Canada (NSERC, funding reference ALLRP-592877-24), PRIMA Québec, and Nouveau Monde Graphite.
This code is under the copyright of its developers and made available as open-source software under the terms of the MIT License.
- Marchisio & Fox (2013) — Computational Models for Polydisperse Particulate and Multiphase Systems
- Yuan & Fox (2011) — CQMOM formulation
- Ouchene (2020) — Oblate spheroid drag and torque correlations
- Strang (1968) — Operator splitting
- Heylmun, Fox & Passalacqua (2021) — Joint size-velocity QBMM