Skip to content
Demo

Surface Water on the GPU

The Surface Water Twin's solver, built for NVIDIA GPUs with Warp, ran 76 storm scenarios for the A27 Chichester bypass on one rented GPU. The modelled water was then exported as an OpenUSD stage, opened in NVIDIA Omniverse and path-traced into the short film below. Open the Surface Water Twin.

RenderedOmniverse RTX path tracingModelledwater depth

43 seconds, silent. The storm of 16 November 2022 on the A27 Chichester bypass, dusk to midnight. Every frame carries its own labels.

What ran

76 scenarios, each run to the end with the same solver code as the Surface Water Twin:

  • 12 recorded storms from the Environment Agency's Fishbourne rain gauge, chosen by the most rain in a day and by the heaviest 15 minutes;
  • 6 synthetic design storms, shapes for testing rather than return periods;
  • 20 runs of the 16 November 2022 storm that vary the ground survey;
  • each of those 38 twice: once with no drainage, once with a 12 mm an hour drainage allowance.

They ran in NVIDIA Warp 1.18 on one rented NVIDIA RTX 6000 Ada GPU, in one sitting on 23 October 2026. All 76 finished.

GPU against CPU

Did the GPU match our CPU? Not within the bars we set, so there are no speed figures here.

Before any scenario ran on a GPU, we wrote down how closely the GPU build had to reproduce our own CPU run and committed it (23 October 2026, 11:15 BST): the deepest water at each of the 8 ponds within 1 mm, the whole 1 m depth field within 5 mm at its worst cell and within 1 mm at the 99th percentile, and the solver's five test cases agreeing to the last few digits.

On a narrow screen, swipe the table sideways for every column.

CheckVerdictResultBar, set in advance
16 Nov 2022 storm: deepest water at the 8 pondsPassunder 0.01 mmwithin 1 mm at every pond
16 Nov 2022 storm: depth field, 99th percentilePass0.03 mmwithin 1 mm
16 Nov 2022 storm: depth field, worst cellFail63 mm, in one patch off the roadwithin 5 mm
Test cases: still lake, sheet flow, dam break, water balancePassall four agreeagree to the last few digits
Test case: filling a basin (water held, as a share of its full volume)Fail0.0035 apartwithin 0.000001
Retest, set in advance: basin with 2 hours of rain fixed (share of its full volume)FailGPU 0.0087 from the Mac, second CPU 0.0044GPU no further from our Mac than a second CPU is
Retest, set in advance: 16 Nov 2022 storm with drainagePassidenticalroad within 5 mm, ponds within 1 mm
Retest, set in advance: 16 Nov 2022 storm, road and pondsPassroad 0.94 mm, ponds under 0.01 mmroad within 5 mm, ponds within 1 mm

The worst-cell miss is a slow, late front of water in one patch of ground off the road, whose arrival shifts with tiny rounding differences. Two ordinary CPUs, our Mac and an x86 server, disagree there by 0.89 m on the same storm, so a second CPU would have failed that line too. The basin test stops the rain by a rule checked every 10 minutes, so a last-digit difference can add or remove 10 minutes of rain.

We wrote a dated amendment and a retest before running it. With the basin's rain fixed at 2 hours the two CPUs still differ by 0.0044 of the basin's full volume, and the GPU sits 0.0087 from our Mac, further than the second CPU. The retest failed as well, and it stands: the bars have not been moved.

What passes: on the carriageway and at the ponds, the GPU and the CPU agree to under a millimetre on both storms compared, and with drainage the two runs are identical.

Stills

Rendered4K, path-tracedModelledwater depth

Six stills, rendered at 4K and shown here at 1080p. Each carries its own labels in the top-left corner.

Whyke Roundabout at 19:30 UTC from low above, street lights on the wet carriageway, modelled water lying along the road edges and on the verges.
The bypass at dusk, 16:52 UTC, from high above: the lit roundabout, low buildings beside it and the lights of Chichester beyond.
A driver's eye view at 19:30 UTC on an unlit stretch: rain lit by the headlamps over modelled water across the road, trees on the skyline.
The bypass from straight above at 19:30 UTC with the modelled depth layer drawn over it in orange where water is deepest, a depth legend with the terrain survey's 0.15 m bound, and the ground outside the modelled band hatched.
Looking along the A27 towards a lit roundabout at 17:45 UTC, the street lights reflected in modelled water on the carriageway.
A roundabout on the bypass at 16:30 UTC in the last of the daylight, lamps coming on, trees and fields around it.

Loop

Renderedpath-tracedModelledwater depth

A 15-second loop: Whyke Roundabout, 19:15 to 19:30 UTC, rain drawn from the gauge rate.

How it was made

Measuredterrain
Environment Agency LiDAR at 1 m (the 2022 composite terrain and surface models).
Measuredrain
The Environment Agency's Fishbourne rain gauge, 15-minute record, 16 November 2022.
Modelledwater
MapMap's shallow-water solver, written in NVIDIA Warp, with no drainage. The film and the stills draw the water from the CPU run of the 16 November 2022 storm, the run the Surface Water Twin shows, at 96 states 15 minutes apart.
Renderedpicture
The terrain, road and water exported as a georeferenced OpenUSD stage, opened headless in NVIDIA Omniverse Kit through Isaac Sim 6.1 and path-traced with RTX on rented NVIDIA GPUs. Buildings are OpenStreetMap footprints with roof shapes fitted to the LiDAR, trees come from LiDAR crowns, and street lamps stand on roads OpenStreetMap tags as lit. Light, rain and materials are illustrative. The water's edge is smoothed for display, within 0.5 m of the model, and the picture between 15-minute model states is interpolated.

Terrain: EA LiDAR Composite DTM and DSM 2022, OGL v3.0. Rain: EA Hydrology API, Fishbourne gauge, OGL v3.0. Roads, buildings: © OpenStreetMap contributors, ODbL. Markings: Traffic Signs Manual Ch 5.

MapMap is a member of the NVIDIA Inception program. This demo is our own work, run on NVIDIA software available to developers; NVIDIA has not reviewed or approved it, and it implies no partnership, endorsement or certification. NVIDIA, Omniverse, Isaac Sim and Warp are trademarks of NVIDIA Corporation.