Troubleshooting Guide

interIsoFoam AMR: Why VOF Droplets Shatter on Mesh Refinement

You add adaptive mesh refinement to an interIsoFoam droplet or spray case to resolve the interface, and instead of a sharper droplet you get a cloud of spurious satellites — or little pockets of the wrong phase inside. It is one of the most-asked and least cleanly answered problems in VOF + AMR. This guide explains the mechanism behind the shattering, why the reconstruction scheme matters, the trap that bites moving droplets specifically, and the settings that actually stop it.

By CFDpilot · Updated June 2026

1. The mechanism: AMR doesn't preserve the reconstructed interface

interIsoFoam advects the interface geometrically: each step it reconstructs a sharp PLIC/iso surface inside the interface cells and transports the volume across faces from that surface. When dynamicRefineFvMesh refines or unrefines, it interpolates the alpha field onto the new cells conservatively — mass is preserved — but it does not preserve the reconstructed surface. Immediately after a remesh, isoAdvector has to rebuild the interface from an alpha field that has just been redistributed across different cells. That reconstruction comes out slightly wrinkled, and because the scheme advects sharply, the wrinkles are amplified over the next steps into satellite droplets.

Two observations from the field confirm this is a numerical perturbation, not physics:

2. Use plicRDF, not isoAlpha

The reconstruction scheme is the single biggest lever. plicRDF seeds each reconstruction with the surface normals from the previous time step, so it "remembers" the smooth surface across a remesh. isoAlpha recomputes the normals from scratch every step, so it directly inherits the post-refinement noise and shatters far more readily. With plicRDF you can push refineInterval and maxRefinement higher before the droplets break up.

// system/fvSolution — alpha solver
"alpha.*"
{
    reconstructionScheme   plicRDF;   // not isoAlpha
    isoFaceTol             1e-8;
    surfCellTol            1e-6;     // see §4
    snapTol                1e-12;
    nAlphaBounds           3;
    clip                   true;
}

3. The moving-droplet trap: refineInterval and nBufferLayers

This is the failure mode behind the worst cases — translating droplets, collisions, axial-flow sprays — and it is rarely diagnosed. A moving droplet travels between remeshes. With refineInterval = 5 it can advance several cells before the refined band is rebuilt, so its leading edge crosses out of the refined zone into the 2:1 transition or the coarse cells before the next refinement. That under-resolved front is exactly where the shattering nucleates. It is also why a stationary rising bubble often behaves while a collision or a jet does not.

Two settings fix it:

// constant/dynamicMeshDict
refineInterval    1;
nBufferLayers     4;
maxRefinement     2;     // lower is safer; raise only with plicRDF + buffer

4. Spurious inclusions: surfCellTol and snapTol

The little pockets of the opposite phase inside a droplet come from cell recombination during unrefinement nudging alpha slightly away from 0 or 1. The error accumulates over refine/unrefine cycles until alpha crosses surfCellTol, at which point isoAdvector starts treating the cell as an interface cell and an inclusion appears.

The instinct to tie surfCellTol and snapTol together is right, but the direction matters — tightening surfCellTol makes it worse. surfCellTol is the band within which a cell counts as an interface cell; the tighter it is, the more near-pure cells get flagged as interface. So go the other way:

5. Check correctFluxes

In dynamicMeshDict, correctFluxes tells the refiner how to re-interpolate each flux field on the faces that changed. An incomplete or wrong list corrupts the fluxes right at refinement and seeds interface errors. Don't copy it blindly — verify it against the interIsoFoam AMR tutorial shipped with your OpenFOAM version, because the field names (rhoPhi, alphaPhi, nHatf, …) and which should be reinterpolated vs left as none have changed between releases.

6. When it's the method, not your settings

Be honest about the limit: hex-octree AMR plus a geometric VOF scheme will always introduce some perturbation at the interface when it remeshes. For most cases the settings above reduce it below what matters. For a spray where the end product is a droplet size distribution, two practical defences:

A robust starting point

For a single moving droplet that is shattering, start here and relax only once it's stable:

reconstructionScheme   plicRDF;
refineInterval         1;
nBufferLayers          4;
maxRefinement          2;
surfCellTol            1e-6;
snapTol                1e-12;

FAQ

Why do my VOF droplets break up when I use AMR in interIsoFoam?

Refinement interpolates alpha conservatively but does not preserve the reconstructed PLIC/iso surface, so isoAdvector rebuilds a slightly wrinkled interface after each remesh and amplifies it into satellites. It is numerical, not physical.

Should I use plicRDF or isoAlpha for AMR droplets?

plicRDF — it reuses the previous step's normals and stays smoother across a remesh, while isoAlpha recomputes from scratch and shatters more.

Why does a smaller refineInterval reduce breakup?

A moving droplet outruns the refined band between remeshes; with a large interval its front crosses into coarse/transition cells and shatters. refineInterval 1 keeps the band tracking the droplet.

How do I stop spurious inclusions inside a droplet?

Loosen surfCellTol (~1e-6) so near-pure cells snap to 0/1, keep snapTol tight, and don't unrefine cells that recently held the interface. Tightening surfCellTol makes it worse.

Are the AMR satellite droplets real?

No — sub-grid satellites appearing at refinement are numerical. Apply a minimum-diameter cutoff in post-processing for a droplet size distribution, or use a uniform fine mesh in the droplet path.

Official documentation & references

Droplets shattering when AMR kicks in?

CFDpilot is an AI agent for OpenFOAM — it reads your case from the terminal, checks your dynamicMeshDict, reconstruction scheme, refineInterval and surfCellTol against the moving-droplet failure mode, and tells you which one is seeding the breakup.

See how CFDpilot works →