Anisim implements the core of Adaptive Phase-Field-FLIP for Very Large Scale Two-Phase Fluid Simulation (Braun, Bender, Thuerey, SIGGRAPH 2025) and its follow-up ST-FLIP (SIGGRAPH 2026) inside Maya's Bifrost, from the public SDK and shipped nodes only. The authors released their grid data structure, not their solver, so this is an independent implementation from the papers' equations. Its sister repository, Aniso, renders Gaussian splats; the two meet at milestone 7, a tsunami in a captured scene, exchanged as per-frame particle caches.
Why these papers, in three sentences. PF-FLIP fills the air with FLIP particles too, so wind, splashes, spray and air entrainment come from physics instead of white-water heuristics. Its phase field costs nothing: it is the splatted particle mass, normalized, so there is no level set and no surface reconstruction in the solver. The only new machinery over textbook FLIP is a variable-coefficient pressure solve, where each cell face is weighted by the mass that landed on it.
| Milestone | Done | In one line |
|---|---|---|
| 1. The spike | 2026-09-30 | The two-phase projection builds as a Bifrost node and holds a 1000:1 column at rest to 1e-6 |
| 2. The 2D reference | 2026-09-30 | A 300-line numpy spec: hydrostatic rest, dam break, Rayleigh-Taylor |
| 3. The validation gate | 2026-09-30 | The papers' four core claims tested against the obvious alternatives; three supported, one sharpened |
| 4. Phase field from stock nodes | 2026-09-30 | Bifrost's splat reproduces the reference field, mean difference 0.002 |
| 5. The node runs the loop | 2026-10-05 | Lockstep to 1e-6; the whole simulation inside one headless graph |
| 6. 3D at small scale | 2026-10-08 | Multigrid solve, droplets and bubbles, ST-FLIP, adaptive particles, obstacles; the overnight bore suite matches Stoker's bore speed to 1.7 percent |
| 6.5. The adaptive solve | 2026-10-12 | Built and gated in 2D and 3D, kept as an option: at this scale it does not pay |
| 6.75. The fused transfer | 2026-10-09 | One custom node replaces sixty stock splats: 9.4x a substep, threaded to 26x by 2026-10-10 |
| Mesh colliders | 2026-10-14 | Any mesh through the shipped collider node, cut cells, gated in 2D, the node and the graph |
| The 512 run | 2026-10-15 | 512 x 128 x 256 cells, 52 M particles, 20.4 s simulated in 2.4 h, every substep kept |
| 7. The shot | open | Scene chosen 2026-10-13; the next piece is a breaking-wave ocean with a wavemaker |
The full record of every milestone, with its numbers, stands in docs/history.md. The settled decisions and their reversals are in docs/decisions.md, what is still open in docs/open-questions.md, every chart and image with what it shows in docs/evidence.md, and the layout of the local run outputs in docs/outputs.md.
For the current breaker images, start with rendering navigation,
the validated setups and the local
media gallery. The gallery is generated from existing
local outputs and is not hosted on GitHub. Its builder and the grouped breaker
instruments live under experiments/rendering/; historical script paths remain
compatible. No simulation or render is needed to regenerate the gallery.
The wave-feature diagnostic and October 20 continuation record the small Maya particle demo, its stronger 60-second replacement, and the separately scheduled 18–30-second 3D spray run. The distant perspective observation reuses the 24.9-second cache and 60/40 foam appearance.
The October 20 force-driven sea plan records the agreed 2D/coarse-3D preview direction and a 30-second production budget of approximately fifteen hours. The old 18–30-second continuation is cancelled; its automation was deleted. The force generator has since been implemented for the previews below; no replacement production run is scheduled.
The new force-driven wave previews replace the velocity-target wave zone with pre-projection acceleration. They are particle previews for scene approval, with independent force and checkpoint gates; production resolution and start time remain undecided. The October 20 handoff collects the validated rendering configurations and current preview state, including the unresolved Maya display issue.
Windows, Maya 2027 with Bifrost 3.1, Visual Studio 2022, Python 3.13.
py -3.13 -m venv .venv
.venv\Scripts\pip install -r requirements.txt (pinned: every recorded result used these versions)
nodes\build.bat (the custom node pack; needed by every 3D run)
Then, from the repository root:
| To | Run |
|---|---|
| Check the 2D reference against the papers' claims | cd reference2d then ..\.venv\Scripts\python.exe validation.py (80 s) |
| Check the Bifrost node against the reference | cd gates then ..\.venv\Scripts\python.exe validate_step.py (and the other validate_*.py; each exits nonzero on failure) |
| Run the boulder showcase, a chunk at a time | .venv\Scripts\python.exe experiments\collider_showcase.py stage 0 --grid 256 64 128 |
| Play a run in Maya as particles | maya\play_showcase_in_maya.bat blend boulders512 |
| Render that playback to a video | maya\render_play_scene.bat out\play_boulders512_blend.ma out\collider_showcase\boulders512_render boulders512 |
| See every run on disk, its size, and what can be rebuilt from what | .venv\Scripts\python.exe graphs\runs.py report |
Every run writes under out\runs\<tag>\ at the root, which is ignored (the layout is in docs/outputs.md); the repository keeps code and small numeric evidence only.
One folder per job.
reference2d/: the executable spec, a pure-Python 2D implementation every Bifrost stage is validated against, with its scenes and gates. Start with its README and VALIDATION.md.nodes/: the custom Bifrost SDK operator pack.PFFlipSolve3.cppis the 3D step with its multigrid solve,PFFlipP2G.cppthe fused transfer,PFFlipAdaptive.cppthe adaptive pressure solve,PFFlipSolids.hthe level-set solids.graphs/: the Bifrost graphs, their generators, and the.batlaunchers that run them headlessly through bifcmd.loop3d.pyis the 3D loop runner the gates and experiments share;colliders.pyturns meshes into a solid field;runs.pysays where a run's files live underout/and reports what is there.gates/: the validation ladder, onevalidate_*.pyper feature, each exiting nonzero on failure.experiments/: the showcase (collider_showcase.py), the solitary wave onto the beach through the node (solitary_beach.py), the first breaker from the wavemaker (piston_beach.py), the overnight bore suite, the speed receipts and the threading experiment;archive/holds the one-off studies that settled a question, with an index.maya/: playback and rendering in Maya: the play cache, the Bifrost compounds, the scene builders, the one-click launchers and the render presets (maya/presets/, the knobs explained).results/: the committed evidence, charts and receipts:2d/for the two-dimensional runs (the Python reference and the 2D Bifrost loop),3d/for the 3D node and graphs; the videos they describe stay local.docs/: the history, the decisions, the open questions, the evidence gallery and the output layout.
The simulator was born inside Aniso under sim/ and moved here on 2026-10-11 so each repository has one job. Every Aniso commit that touched the simulator came along with its author, date and message; each carries an Aniso-commit: trailer naming its original hash, and references like Aniso#38 point at the pull requests where the work was reviewed. The interface between the two repositories is the per-frame particle cache: positions, velocities, phase, escape flags and particle scale as .npy arrays.