Volume Averaged Navier-Stokes
The VANS axis develops MigFlow's fluid-phase solver: a Volume-Averaged Navier–Stokes formulation, two-way coupled to the discrete grains resolved by NSCD, that resolves the interstitial fluid at a scale which can be coarser than, comparable to, or finer than the grains themselves. Rather than choosing a single resolution up front, the same formulation spans the unresolved, semi-resolved, and fully resolved regimes, with the mesh-to-grain size ratio $h/d$ as the only real dial — from a coarse mesh homogenising a dense packing to a fine mesh that resolves the boundary layer around individual grains. This flexibility has been validated across configurations that stress the coupling in different ways: a granular Rayleigh–Taylor instability, the fluidisation onset of a granular layer, the sedimentation of a resolved 2D cylinder, and the drafting–kissing–tumbling interaction between two settling particles.
Key Concepts & Methodology
Volume-Averaged Navier–Stokes Equations
The fluid is not solved around each grain individually. Instead, following Anderson's framework, the pointwise Navier–Stokes equations are passed through a filtering (averaging) operation over a kernel large enough to span several grains, producing a fluid volume fraction $\epsilon$ (with $\phi = 1-\epsilon$ the solid fraction) and a handful of closure terms standing in for the unresolved grain-scale physics. Once those closures are specified, the resulting Volume-Averaged Navier–Stokes (VANS) system reads:
where $\mathbf v$ is the averaged grain velocity and $\boldsymbol\tau$ the viscous stress. Two of the unclosed terms are simplified directly: the residual (Reynolds-like) stress from velocity fluctuations is neglected at the low particle Reynolds numbers considered, and the filtered viscous stress is kept as the plain Newtonian $\epsilon\boldsymbol\tau \approx \eta(\nabla\mathbf u+\nabla\mathbf u^{\mathsf T})$ — any extra dissipation from dense packing is left to the discrete grains themselves, rather than folded into an effective fluid viscosity, so it isn't counted twice. The remaining term, the grain–fluid interaction force $\mathbf f_d$, is where the real closure modelling happens.
This is a Dallavalle-type drag law, corrected for neighbouring grains through the Di Felice voidage exponent and valid from the dilute to the dense limit.
Stabilized Finite Element Discretization
Velocity and pressure are both discretised with linear (P1–P1) continuous Galerkin shape functions on the same mesh — simple and cheap, but equal-order interpolation does not satisfy the inf–sup (LBB) condition on its own, which would otherwise produce spurious pressure oscillations. Two consistent stabilisation terms are added to the weak form to make the discretisation well-posed: a Pressure-Stabilising Petrov–Galerkin (PSPG) term restores a solvable pressure problem, a Streamline-Upwind Petrov–Galerkin (SUPG) term stabilises the advection-dominated regime.
Representing the Grains on the Fluid Mesh
Three quantities carry the whole grain–fluid interaction: the solid fraction $\phi$ (with $\epsilon=1-\phi$ the fluid fraction), the solid flux $\phi\mathbf{v}$, and the interaction force $\phi\mathbf{f}$. Since the fluid is already discretised with the Finite Element Method, an $L^2$ projection is the natural way to bring each of them from the grain scale onto the mesh — testing the grain-scale quantity against a nodal test function $\tau$ and integrating it over each grain's own volume $V_p$:
Left as it is, this projection can overshoot or undershoot the true solid fraction; MigFlow lumps the porosity's mass matrix so that $\phi$ — and with it $\epsilon$ — stays bounded between 0 and 1 at every node, rather than only in an averaged sense.
How the grain-volume integral $\int_{V_p}$ is actually evaluated is where accuracy used to break down. The original Particle-Centroid Method (PCM) evaluates it at a single point — the grain's centre — which is cheap but breaks down whenever a grain spans several elements: historically this forced a rule of thumb, keeping the grain diameter at least three times smaller than the mesh size, and still required an unphysical artificial pressure-diffusion term just to keep the pressure field stable. MigFlow now integrates instead: each grain is decomposed into the sub-regions defined by its intersection with every mesh element it overlaps, and the projection is evaluated over these exact sub-elements rather than a single point. Because each sub-region's shape is known exactly, any linear field — the shape functions $\tau$ included — can be integrated over it exactly, with no quadrature error. This removes the artificial diffusion entirely, spreads the interaction force smoothly as a grain crosses element boundaries instead of jumping between them, and keeps the void fraction bounded and physically consistent — valid precisely because NSCD already guarantees grains never overlap.
Semi-Implicit Coupling
The drag force $\mathbf f_d$ enters the momentum equation as a source term that can dwarf every other one, so coupling it explicitly to the grain motion would force impractically small time steps to stay stable. Instead, the grain velocity is predicted implicitly, within the same linear system as the fluid unknowns:
which, once substituted back into the drag force, effectively divides the drag coefficient by $(1+\gamma^n\Delta t/m)$: the stiffer the local coupling, the more it self-limits, so the drag stays bounded and always dissipative no matter how small the local void fraction gets. A floor $\epsilon_{\min} = 10^{-8}$ is enforced for the rare cells fully covered by a grain, keeping the pressure problem well-posed even in that limit — the same mechanism behind volume-penalisation methods.
A Two-Dimensional Approximation
Most simulations are run in two dimensions, with spherical grains modelled as infinite cylinders — discs in the simulation plane. This is a genuine approximation, not a free simplification: a random packing of discs settles at a packing fraction $\phi \approx 0.82$, well above the $\phi \approx 0.64$ of real spheres, since discs cannot nest on top of one another out of plane. To compensate, the fluid solver uses a smaller effective grain diameter when computing the local volume fraction $\epsilon$, while the grains' own dynamics still uses their true diameter and are restricted to three degrees of freedom rather than six. The result captures the essential physics well enough to be reused, with calibration, in later chapters — but it is not intended to be quantitatively three-dimensional.
Granular Rayleigh–Taylor Instability
Supplementary documentation
Granular vs. Classical Rayleigh–Taylor Instability
The classical Rayleigh–Taylor instability appears whenever a heavier fluid sits above a lighter one: any perturbation at the interface grows, and as the heavy fluid falls it forms a large finger that itself breaks into smaller ones, cascading into a chaotic pattern with no preferred scale.
A dense granular packing above a fluid behaves differently. The grains still fall as fingers, but the fingering process is self-limiting: rising bubbles of the lighter phase get trapped between fingers, only spawning a new finger once they widen past a critical size. The result is a pattern with a fairly consistent structure size, rather than an unbounded cascade — a direct signature of the granular medium's discreteness.
This bubble-and-finger dynamic is the same mechanism that governs voidage formation in fluidised beds and other gas–granular systems, making it a natural benchmark wherever a lighter fluid has to work its way up through a dense granular medium.
Simulation Overview
When a dense granular packing is released on top of a lighter fluid in a Hele-Shaw cell, it does not fall as a single front: it fingers, just like the classical fluid–fluid Rayleigh–Taylor instability — but with a crucial difference. Where the classical instability cascades chaotically, each finger breaking into ever-smaller ones as pressure and density gradients misalign, the granular version self-limits: fingers widen as they fall, and new ones only nucleate at the centre of a rising air bubble once it reaches a critical width. The result is a characteristic, comparatively stable structure size instead of a chaotic cascade — governed by the discreteness of the grains and the fluid's incompressibility rather than by scale-free instability growth.
It is also a deliberately harsh stress test for the coupling itself: with polystyrene grains in air the density ratio is only around 870, but the two phases are so far apart in inertia that the Atwood number $\mathrm{At} = (\rho_p-\rho)/(\rho_p+\rho) \approx 0.998$ — essentially the theoretical maximum, as if the grains were falling into vacuum. The setup follows the experimental and numerical study of Vinningland et al., and is run with the overlap-wise grain representation described above, at a mesh-to-grain ratio around $h/d \approx 10$ — deep in the unresolved regime, where the fluid mesh spans many grains at once. The experiment's thin Hele-Shaw gap is not meshed directly: instead, an extra volume drag term $12\eta/b^2$ (with $b$ the gap depth) is added to the fluid momentum balance, reproducing the depth-averaged dissipation of the lubricated flow between the cell's two plates without resolving it in 3D.
As the grains fall, fingers form at the initial air–grain interface and widen; air bubbles get trapped between them, rise, and progressively merge into larger voids. Most of the computational cost sits in the contact solver rather than the fluid resolution, so refining the fluid mesh further comes essentially for free — a useful property for the higher-resolution cases explored elsewhere on this axis.
Key Parameters
Grain Properties
Fluid Properties
Geometry & Domain
Numerical
References & Sources
Bubbling Fluidised Bed
Supplementary documentation
Simulation Overview
A bed of glass beads sits above a narrow injection nozzle at the bottom of a column, and gas (nitrogen) is blown upward through it at a fixed velocity. Fast enough, the incoming gas can no longer simply percolate through the packing: it punches through as discrete bubbles that rise, grow, and stir the whole bed as they go — the bubbling regime of fluidisation. All three of MigFlow's coupled solvers run together here: NSCD resolves every grain–grain and grain–wall contact, VANS carries the gas phase (with the same Hele-Shaw depth-averaging drag $12\eta/b^2$ used elsewhere on this axis, since the cell has a finite out-of-plane depth), and a separate advection–diffusion solver carries heat through the gas and couples it back to the grains.
Heat exchange is genuinely two-way: each grain exchanges heat with the surrounding gas through an interphase term, the walls lose heat by convection, and the resulting gas temperature field feeds back into a Boussinesq-type buoyancy correction $\rho(T) = \rho_0\big(1-\min(\beta\Delta T,\,0.3)\big)$, capped to keep the fluid problem well-behaved even where the local temperature swing is large. Grains start well above the incoming gas temperature, so as the bed bubbles and mixes, hot grains are carried up and cooled while heat is continuously convected out through the gas — coupling the mechanical fluidisation problem to a genuine thermal transport problem, in the same spirit as the non-isothermal-flows axis.
As on the other 2D cases of this axis, the true 3D powder mass loaded into the bed is converted into an equivalent 2D grain count using the cell's physical depth, so the simulated packing reproduces the same bed inventory as the real experiment rather than an arbitrarily chosen number of disks.
Key Parameters
Column & Grains
Fluid & Injection
Thermal Boundary Conditions
Numerical
Fluidised Beds
Blow gas fast enough through a bed of granular solids and the packing stops behaving like a solid altogether: grains become suspended and mobile, the bed takes on fluid-like properties, and beyond a certain gas flow rate the excess gas can no longer percolate uniformly — it breaks through as bubbles that rise and vigorously mix the bed.
This bubbling regime is exploited industrially wherever fast, uniform gas–solid contact and mixing are needed: fluid catalytic cracking in oil refining, coal combustion and gasification, drying and granulation, and coating processes all rely on it — making it one of the most common ways solids and gases are made to interact at an industrial scale.