Skip to content
SHD Sim
Menu

Validation/Lagrangian particles

A particle settling in still air

A sphere stops accelerating when drag balances its buoyant weight. The particle is sized so that Schiller–Naumann and Stokes agree to 0.86 %, which makes the reference one an engineer can also reach on paper.

VerificationSettling speed 1.16506 × 10⁻² m/s against a terminal 1.16696 × 10⁻² m/s, −0.163 %

Why this case

The Lagrangian solvers are the second largest family in the product — twelve of them — and until this case not one had a reference behind it. A parcel cloud that runs to End writes particle velocities whatever the forces on it were, and nothing in the output says whether those velocities are the right ones.

A single sphere falling through fluid at rest gives the cheapest possible answer to that. It stops accelerating when drag balances its buoyant weight, and the speed at which that happens is an exact force balance with no free parameter in it — not a fitted constant, not a correlation of the whole system, just three forces set equal.

PhysicsOne-way coupled Lagrangian parcels in still air — icoUncoupledKinematicParcelFoam
Particle20 µm parcels, ρp = 1000 kg/m³, 10 000 of them
FluidAir at rest: ρf = 1.225 kg/m³, µ = 1.85 × 10⁻⁵ Pa·s
Forces`gravity` at 9.81 m/s² down the y axis, and `sphereDrag` — both asserted, not assumed
TimeTo 0.05 s, which is 41.6 relaxation times of 1.2012 ms
TravelThe cloud falls 0.58 mm in a domain 100 mm tall, so nothing reaches a wall
ReferenceThe terminal-velocity force balance with sphereDrag’s own Schiller–Naumann law, solved by bisection; Stokes’ law as the paper check
AgreementSettling speed 1.1650584 × 10⁻² m/s against a terminal 1.1669573 × 10⁻² m/s — 0.163 % low, with every parcel on the same number

The exact solution

A sphere of diameter d and density ρp falling at speed v through a fluid of density ρf reaches its terminal velocity when the buoyant weight and the drag are equal:

    (pi/6) d^3 (rho_p - rho_f) g  =  Cd (pi/8) d^2 rho_f v^2

The drag coefficient is not free either. The product asks for sphereDrag, whose law is Schiller–Naumann,

    Cd = (24/Re) (1 + 0.15 Re^0.687)     Re <= 1000
    Cd = 0.44                            above it

    with   Re = rho_f v d / mu

which makes the balance implicit in v, because Re contains v. The harness therefore solves it by bisection rather than quoting a formula. That is what makes the reference exact for the drag law the product actually applies, and not for a tidied version of it.

There is a second reference sitting underneath, and it is the one that matters for rule two. In the limit of vanishing Reynolds number the balance collapses to Stokes’ law, which anybody can evaluate on paper without knowing what a CFD code did:

    v = (rho_p - rho_f) g d^2 / (18 mu)

The particle size was chosen so that the two agree. At the 100 µm the product stages, the particle Reynolds number is about 3, where the harness records the two laws as 31 % apart — a Schiller–Naumann reference would then be carrying the whole comparison. At 20 µm the Reynolds number is 0.0155 and the two laws sit 0.855 % apart, so the number this page reports is one an engineer can also reach with a calculator.

The reference, both ways, for a 20 µm water-density particle in air
QuantityValue
Terminal velocity, Schiller–Naumann by bisection1.1669573 × 10⁻² m/s
The same by Stokes1.1769349 × 10⁻² m/s — 0.855 % higher
Particle Reynolds number at that speed0.0154543
Relaxation time1.2012 × 10⁻³ s
All four are the fixture's own reference block. The percentage is Stokes against Schiller–Naumann.

Two things the run has to prove before the number counts

That a terminal velocity exists yet. A parcel released from rest approaches its terminal velocity exponentially with a time constant of 1.2012 ms. Stop the run at two of those and what gets measured is a particle still accelerating, or an injection speed on its way down. The run covers 0.05 s, which is 41.6 relaxation times, and the harness refuses to report anything below ten.

That the cloud is doing one thing. Every parcel is the same size and, because the injection was shortened to 0.1 ms, the same age, in fluid at rest. They must therefore all agree, and a mean taken over a cloud that disagrees would hide whatever is disagreeing. Measured, the 10 000 parcels span exactly nothing: minimum, mean and maximum are the same 1.1650584 × 10⁻² m/s, and OpenFOAM writes the whole cloud as one compact entry because every member of it is identical.

Result

The settling cloud against its terminal velocity
QuantityMeasuredAgainst the reference
Settling speed (mean of 10 000 parcels)1.1650584 × 10⁻² m/s−0.163 % of Schiller–Naumann
The same against Stokes1.1650584 × 10⁻² m/s−1.009 %
Spread across the cloud, (max − min)/mean0.0000 %
Run length in relaxation times41.6harness floor is 10
The measured column is the fixture's own min/mean/max, which are one number. The percentages are that number against the 1.1669573 × 10⁻² and 1.1769349 × 10⁻² m/s in the table above.

The control that comes free

The same case with sphereDrag taken out of particleForces and nothing else changed is kept as a fixture. It is not a broken case in any way the product would report — it runs, it reaches End, it exits 0 and it writes a full cloud.

The parcels simply free-fall. They reach 4.9875 × 10⁻¹ m/s, which is 4174 % of the terminal velocity and within 1.68 % of the g·t = 0.4905 m/s a stopwatch would give over the same 0.05 s. That is what a cloud with no drag model looks like from the outside, and it is the reason the measurement above is a measurement rather than a formality: the gap between a drag model working and no drag model at all is a factor of forty-three, and nothing in the solver’s output remarks on it.

What this page does not establish

  • One particle size, one fluid, one gravity. Everything here is a 20 µm parcel of ρ = 1000 kg/m³ in air. There is no sweep over diameter, density or viscosity, so nothing on this page says the solver still lands on the balance at a Reynolds number where the drag law has curvature in it.
  • The remaining 0.163 % is reported, not attributed. This case was run at one time step and on one mesh. Time integration is the obvious candidate and the harness’s tolerance was set with that in mind, but no second step was run, so nothing here separates it from any other cause.
  • This is not the case as the product stages it. Three things were changed and each one is the difference between measuring drag and measuring something else: the parcel is 20 µm instead of 100 µm, so that Stokes is also an answer; the injection is instantaneous instead of running for a second, so that every parcel is the same age rather than a mixture of ages still accelerating; and the injection speed is not the staged 10 m/s.
  • Nothing is established about walls, collisions or two-way coupling. The solver is icoUncoupledKinematicParcelFoam, so the parcels never act back on the air, and the cloud falls 0.58 mm in a 100 mm domain, so no parcel comes near a boundary and the wall interaction model never enters the answer. Parcel-parcel collisions are absent by construction; a dispersed phase this dilute has none.
  • Nothing is established about turbulent dispersion. The fluid is at rest. A parcel in a turbulent flow gets a stochastic velocity from a dispersion model that this case never calls.

Repeat this yourself

Every case here is set up from the worked examples in the product, with no hand-editing of solver files — so you can run it, and get the same numbers. The free tier runs real cases up to 250,000 cells of fluids, or 100,000 nodes of solid, with no account needed to download and no time limit.

All validation cases · Written by the team building SHD Sim.