Marin CitySponge Project

Sources & limits

What is measured, what is modeled, and what is frankly a guess

Everything on this site comes out of one flood model and one measuring tool, both small enough to read in an afternoon. This page says where each number came from, which would move if somebody measured, and which single assumption the whole thing hangs on. To check the work rather than read about it, start with the table.

In short. The ground is measured: every street and hillside height on this site comes from a public laser survey () published by the US Geological Survey, and the culvert and pond sizes come from the county's own drainage studies. The water is modeled, not measured: nobody has yet recorded how deep it got on any street on any day. The tide, the shut gate's leak, how long the hill takes to deliver its rain, and how much rain runs off rather than soaks in are all estimates. So the model can say whether the bowl fills while the gate is shut, and roughly for how long, but not how deep the water would be at your door. Every technical word on this page is explained in the glossary at the bottom.

How sure we are

Three kinds of number, and how far to trust each

Every quantity on this site sits in one of three tiers. They are not equally trustworthy, and the distance between them matters more than any single number.

Tier 1

Measured

The ground. Not yet the water.

The terrain is survey: USGS 3DEP at Quality Level 1 — the highest grade the federal elevation program publishes — flown at 1 m, bare earth, in vertical datum . It is public domain, so it can ship with this page rather than be fetched from anyone. Every elevation on this site is read off it by scripts/build-terrain.py in the repository, so the number under any claim can be reproduced rather than taken on trust.

Until recently this tier was empty and the ground was 42 hand-placed points with arithmetic between them. Swapping guesswork for measurement moved things a long way: the flat came out 1 to 4 meters higher than the old figures and the hillside 4 to 12 meters lower. The model had been exaggerating the bowl at both ends.

What is still missing is the water: no gauge, no tape measure, no depth read off a photograph, nothing that says how deep it got, on what day, at what tide. The photo tool exists to start filling that gap. When measured depths arrive, paired with observed bay levels, they test the model rather than join it, and the two fitted numbers below — the gate's leak and the watershed's lag — should be re-fitted to them.

Tier 2

Interpolated

The meter between the measured posts.

The lidar is posted at one meter; this model runs on six-meter cells, each sampled between the four measured posts around it. That is interpolation across a meter of real ground — a far smaller claim than what this tier used to describe, a surface invented across a whole neighborhood from a few dozen guessed points.

Bare earth is also an interpretation: the lidar processing strips out buildings and vegetation to leave the ground the water runs over. That is the right surface for a flood model and the wrong one for a picture of the neighborhood, which is part of why the massing on the model page stays mostly generic.

Tier 3

Assumed

The tide, and two fitted numbers: how much a shut gate leaks, and how long the hillside takes to deliver its rain.

The tide is the weakest thing here. It is a six-constituent harmonic synthesis, realistic in character and not a forecast for any date. Over thirty simulated days it runs 0.50 to 7.61 ft NAVD88; the recorded bay went from −0.60 to 7.78 ft in four days of December 2015 alone, and the drainage study models a hundred-year tide of 9.66 ft. Six constituents cannot make a spring low, let alone a storm surge — and the study found the basin's worst levels came from the highest tides with the least rain, the case this model cannot produce on its own.

The gate's leak is fitted, at 18 percent of what the same gate passes open. The drainage study says outright that the gate leaks — the basin rises when it is shut and there is no rain — and cites a 2016 WRECO inspection. The number comes from the two dry days of the December 2015 record.

The 's lag is fitted too, at 1.4 hours, standing in for the Snyder the study used. Without it a balanced design storm's peak five minutes — 130 mm/h — reach the basin undamped and the modeled levels run about a foot high against the study's own table. With it all four rows land within a quarter of a foot.

What is no longer in this tier is the culvert. It used to be: an effective area of 0.55 m², about a third of the opening, fitted until the results looked right, and this page called it the load-bearing guess in the model. It could not have been right. The storm discharges published by BKF, the engineering firm whose hydraulic model appears in Caltrans' environmental document, would need about twenty feet of head to pass through it, in a pond six feet deep. The model now uses the 72 by 38 inch clear opening the county reports.

The constants, one by one

Every number the model rests on, with its tier. Read each value against its tier: several were assumptions until recently, and the table exists so the ones that still are cannot hide among the ones that are not.

Model constants, their values, which tier of the claim ladder each belongs to, and what each rests on.
QuantityIn the modelTierWhat it rests on
The ground surface27,156 cells at 6 mMeasuredUSGS 3DEP Quality Level 1 lidar, 1 m bare earth, vertical datum NAVD88. Public domain. Resampled to this grid by scripts/build-terrain.py.
Vertical datumNAVD88, metersMeasuredThe datum the lidar arrives in, and the one the county's stormwater plan states it uses, so the model's numbers and the county's can be read against each other without a conversion.
Observations of floodingnoneMeasuredNo gauge, no depth read off a photograph. The ground is measured; what the water does on it is not.
Street and landmark positionslatitude and longitude, in the sourceAssumedTaken as given from the project's own site coordinates, with no record of how they were established — and the lidar has now caught at least one of them in the wrong place. See the note below.
Ground between the 1 m postsbilinear, 6 m cellsInterpolatedThe lidar is posted at 1 m and this grid is 6 m, so each cell is sampled between four measured posts. Interpolation across a meter, not across a neighborhood.
Storage–elevation curve of the bowl201 levels, −1.0 m to +9.0 mMeasuredCounted straight off the measured heightmap: inland cells below each level, times cell area. About 1.4 acres below +1 m, 14 below +3 m, 48 below +4 m.
Contributing watershed344 acres (1.39 km²)AssumedThe total is the county's — it calls the watershed approximately 340 acres — and so is the split: a Phillips catchment of 194 acres that bypasses the pond and joins the outlet culvert below it, and the rest, which drains to the basin, thirteen acres of it through the flap-gated street drain. The model now carries all three paths.
Runoff coefficient0.60 today, 0.52 with sponge measuresAssumedPlausible values for a catchment of this character. Not fitted to any local gauging.
Culvert opening72 by 38 inch (1.77 m²)MeasuredThe clear opening the Marin City Stormwater Plan (October 2025) reports. Corroborated independently: it is the area that passes BKF's three published storm discharges at plausible tide levels, and no smaller area can.
Gate leak when shut18 percent of the open areaAssumedFitted against the two dry days of the December 2015 gate record. The drainage study says the gate leaks and cites a 2016 WRECO inspection; this puts a number on it.
Watershed lag1.4 hoursAssumedOne linear reservoir standing in for the Snyder unit hydrograph the drainage study used. Fitted against the four basin levels in its Table 3, which it reproduces within a quarter of a foot.
Detention basin below its spill3.2 acres, invert to 7.5 ft NAVD88MeasuredThe drainage study's own HEC-RAS storage area (Appendix E §1.5.3). Read straight off the lidar, the bowl presents about 5.7 acres at the spill against the study's 3.2, because the lidar counts low ground around the basin that the basin's own banks keep out.
Culvert invert+0.91 m (+3.0 ft) NAVD88AssumedThe level below which nothing leaves, whatever the tide is doing. The county records the pond invert silted up to around 3 ft NAVD88; the invert at the bay end is not published.
Flood threshold, Drake & Donahue+2.53 m (+8.3 ft) NAVD88MeasuredThe bare-earth ground, read off the lidar, in the middle of the junction by the Gateway, where OpenStreetMap's Drake Avenue crosses between the two halves of Donahue Street. The documents name this corner but give no coordinate, so the place is read from their descriptions. The point used to be a sidewalk 165 to 180 m from the two junctions, at +3.11 m.
Richardson Bay levelsix-constituent harmonic synthesisAssumedRealistic in character for the Golden Gate. Not a forecast, and not fitted to a station record.
Sponge scenario4,500 m³ of detentionAssumedA scenario input, not a design. It stands for infiltration and detention in the aggregate.
Pump scenario50 cfs (1.416 m³/s)AssumedModeled as lifting water over the gate whenever the basin stands more than 0.6 m above mean sea level.

One provenance question this page cannot answer. The elevations are measured now, but the coordinates of the named places (the pond, the gate and the rest) arrived with the model and have no recorded origin, which is why they sit in the assumed tier rather than higher. The corner is the exception: it is now OpenStreetMap's junction by the Gateway, read from how the documents describe it.

  • [TODO: project team to confirm how the project's site coordinates for the streets and landmarks were established.]

If they turn out to rest on real survey, they move up the ladder and this page should say so.

How the model works

How the flood model works

A two-reservoir mass balance over a storage-elevation curve, run for 30 days at five-minute steps. The whole thing is in lib/floodModel.ts, and it is short.

The terrain and the bowl

The model covers a tile of about 879 m east–west by 1,113 m north–south, divided into 6 m cells — 146 × 186, or 27,156 of them. Each cell takes its elevation from USGS 3DEP lidar — Quality Level 1, flown at 1 m, bare earth, in NAVD88 — sampled between the four measured posts around the cell center. Nothing is smoothed and nothing is invented between landmarks.

Nothing is imposed on top of it either. An earlier version of this model raised the Highway 101 embankment by hand and flattened pads for the Marin Gateway and the Golden Gate Village bench, because a surface interpolated from a few dozen guessed points had none of them. Measured ground contains all three because they are there. Each deleted correction is a place the model used to tell you about its own construction rather than about Marin City.

The storage-elevation curve is read straight off that heightmap: for each of 201 levels from −1.0 m to +9.0 m, the model counts the cells inland of the embankment below that level and multiplies by cell area. Measured, that is roughly 1.4 acres of inland ground below +1 m NAVD88, 14 acres below +3 m and 48 acres below +4 m. The curve turns a volume of runoff into a depth in the street: a cubic meter arriving in a wide, flat bowl raises the water far less than the same cubic meter in a narrow one.

What happens at each step

The run is 30 days at five-minute steps — 8,640 of them — starting with the water in the basin 0.35 m below the culvert invert. At every step the model does four things.

  1. Rain. Six 24-hour storms are placed across the month by start hour; the largest is sized by the return period you choose and the other five are fractions of it. Within a storm the intensity follows the drainage study's balanced distribution: light at the start, a sharp peak in the middle, light at the end. Outside all six, it is dry.
  2. Inflow. A fixed fraction of that rain reaches the bowl, after the lag the hillside imposes (the capacitor in the physics section below).Qin = C × i × AwC is the (0.60 today, 0.52 with ), i is rainfall intensity, and Aw is the 344-acre watershed — 1,392,120 m². In the sponge scenario, up to 4,500 m³ is intercepted before it arrives — and then simply drops out of the model. The store empties over the dry hours after a storm, clearing a full 4,500 m³ in about an hour, but that water is never routed back into the bowl. Real detention releases what it holds; this one deletes it, which makes the sponge case slightly better than it should be.
  3. Outflow. One culvert, treated as an under the head between the water behind the gate and the bay.Qout = 0.6 × Ac × √(2 g H)Ac is the culvert's clear opening, 1.77 m², and H is the head — the level in the basin, less the bay level or the culvert , whichever is higher. When the bay is higher, H is negative and the gate shuts. It does not seal: the model runs the same orifice backwards at 18 percent, and the bay pushes water into the basin. Setting the gate to seal is what the third lever does.
  4. The level moves. Net volume over the surface area at that level.Δh = (Qin − Qout) × Δt ÷ area(h)The same arithmetic runs for the second reservoir, the streets, which drain into the basin through one flap-gated pipe only while the basin is lower than they are; above 7.5 ft NAVD88 the two spill into each other over the berm. The five-minute step is divided more finely the harder it rains, and both levels are held inside the range of the storage curve. Those are numerical guardrails, not physics.

Street flooding is then a threshold on the level a person standing there would see (the street once there is water on the pavement, the basin before that): the model calls Drake & Donahue flooded whenever that level stands above +2.53 m (+8.3 ft), the measured ground at the corner, and counts the hours it spends there. The low end of Donahue Street and the edge of the pavement are lower, and flood first.

Ten millimeters of rain an hour on 344 acres, at a runoff coefficient of 0.60, is about 2.3 m³ per second arriving in the bowl. The culvert, with a meter of head behind it, passes about 4.7 — twice as much. The pipe is not the problem. The problem is the hours when it is shut, and the 3.2 acres of basin that is all the storage there is until the water goes over the bank.

That is the opposite of what this site said until recently. On a fitted culvert about a third of the real size, the story was that the outlet was too small. On the county's own opening, checked against BKF's published discharges, it keeps up easily whenever it is open. Everything turns on the gate and the tide.

The pump reads against the same arithmetic. 50 is 1.416 m³/s — less than a third of what the culvert passes under a meter of head, but it works when the culvert cannot, which is why it shows up so clearly in the model.

The tide

Bay level is a six-constituent harmonic synthesis. The six periods are those of the principal — 12.42, 12.00 and 12.66 hours, and 23.93, 25.82 and 24.07 — so the result has the right character for the Golden Gate: a mixed tide with two unequal highs a day and a beat of about 14.8 days, which the month-long run crosses twice.

The amplitudes are round two-decimal numbers, not a station's published harmonic constants, and there are no phase offsets: every constituent starts at its crest at hour zero, so day one opens on the largest tide the model can produce, 1.35 m above mean sea level. It is not symmetric: the six periods differ, so the run never comes back to −1.35 and bottoms out near −0.82 m. Realistic in character, and not a forecast for any date.

The model works in NAVD88 meters, throughout. It used to work in a frame of meters that was internally consistent but tied to no published datum at all — enough for the mass balance, useless to anyone else. The lidar arrives in NAVD88, and the Marin City Stormwater Plan states that “all project data and results are in vertical datum NAVD88 (feet)”. Sharing a with the county lets a number here be checked against one there, instead of the two being quietly incomparable.

The tide had to move to match. The synthesis above oscillates about mean sea level, and NOAA's San Francisco station (9414290) publishes its datums against : mean sea level at +0.951 m, NAVD88 at −0.018 m. So NAVD88 sits 18 mm below MLLW, mean sea level stands 0.969 m above NAVD88, and that shift is applied to every bay level the model produces. Without it the tide would sit a meter low against measured ground and every flood on this site would be wrong in the same direction — the exact failure that makes mixing datums worse than having none.

The measured ground at each landmark

These are the eleven named places, from the hillside down to the pond, with the bare-earth elevation the lidar reports at each. They are no longer inputs to anything: the terrain is measured everywhere, and these are simply readings off it.

A measured elevation at the wrong place is still wrong. Swapping guessed ground for lidar caught one of these coordinates out: “Gateway pond” reads +3.74 m (+12.3 ft) — higher than Drake & Donahue, which a pond cannot be. The lowest inland ground in the tile is some way from where the pond is listed, so that coordinate is probably on the shopping center rather than the water. “Drake Ave hillside” was hand-set at +19 m and measures +7.28 m (+23.9 ft), which on a slope is what a hundred meters of position error looks like. “Drake & Donahue” was a sidewalk 165 to 180 m from the two places Drake meets Donahue, and read +3.11 m. It is now the junction by the Gateway, at +2.53 m (+8.3 ft). Where these coordinates came from is not recorded, and that now matters more than it did. [TODO: project team to establish and record how the site coordinates were fixed, and correct the ones the lidar contradicts.]

  • +23.49 m (+77.1 ft)Golden Gate Village
  • +9.21 m (+30.2 ft)Graham Park
  • +7.28 m (+23.9 ft)Drake Ave hillside
  • +6.92 m (+22.7 ft)CSD / Rec Center
  • +5.3 m (+17.4 ft)MLK Academy
  • +3.74 m (+12.3 ft)Gateway pond
  • +3.32 m (+10.9 ft)Arts Gallery
  • +2.91 m (+9.5 ft)Donahue corridor
  • +2.53 m (+8.3 ft)Drake & Donahue
  • +0.75 m (+2.5 ft)Sluice gate
  • +0.01 m (+0.0 ft)Bay shoreline

The physics

Almost all of this is AP Physics C

If you are not here for the equations, skip to What the model cannot tell you. Nothing in the model is exotic: conservation of mass, the work–energy theorem, one separable differential equation, superposition of sinusoids and a first-order numerical integrator, every one of them on the AP Physics C syllabus. So a student who has taken the course can check this model rather than take it on faith, and the places where the physics is not clean are the places to look hardest.

Conservation of mass

The whole model, in one line

A(h) · dh/dt = Qin − QoutWater in, minus water out, equals the rate the volume changes. The basin is held at the study's 3.2 acres, but on the streets the surface area A grows with the level h, so the same net flow raises the water faster when it is shallow. Everything else on this page is a statement about what goes in one of those two terms.

Work–energy theorem

Why the outflow has a square root in it

½ m v² = m g H ⟹ v = √(2 g H)A parcel of water at the surface falls a height H to the opening, and its potential energy becomes kinetic. The mass cancels — the same reason a dropped ball's speed does not depend on its mass. Multiply that speed by the opening's area for a volume flow rate. At one meter of head, v = 4.43 m/s and the culvert passes about 4.7 m³/s.

Separable ODE

The draining tank, and why it slows down

t = (2 A) / (Cd Ac √(2g)) · √h₀Put the two equations above together and separate the variables. Emptying a prismatic basin against a fixed takes a time proportional to the square root of the starting depth — so quadrupling the head only doubles the time. For this basin: 1.08 hours from half a meter, 2.17 from two meters. The model does not use that formula, and the reason is the point of the next box.

Superposition · beats

Six cosines make two weeks

T = 1 / |fS2 − fM2| = 14.77 daysThe tide is six cosines added together. Two of them — the solar semidiurnal at 12.00 hours (fS2) and the lunar at 12.4206 (fM2) — differ slightly in period, so they drift in and out of phase and their sum swells and shrinks. That is the beat frequency from the waves unit, and 1/|1/12.00 − 1/12.4206| is 354 hours: the 14.77-day spring–neap cycle. Nobody put that in. It falls out of two periods and the superposition principle.

RC circuit

The hillside is a capacitor

dS/dt = I − S/τ ⟹ S(t) = I τ (1 − e−t/τ)This is the charging capacitor from the electricity half of the course, with water instead of charge. Rain lands on the hillside; the hillside holds some and releases it in proportion to how much it is holding. Same equation, same exponential, same meaning for the time constant: after one τ the catchment is delivering 63 percent of steady state. Here τ = 1.4 hours. Without it, a 's peak five minutes arrive at the basin undamped and the modeled levels run about a foot too high.

Numerical integration

Euler's method, and why it needs watching

hn+1 = hn + (dh/dt) · ΔtThe tide moves while the basin drains, so the is never constant, the closed form above does not apply, and the model steps forward instead. is first order — halve the step and you roughly halve the error — and it goes unstable when the step is long enough for a quantity to overshoot its own target. A 3.2-acre basin under heavy rain is exactly that case, which is why the routing sub-steps more finely the harder it is raining, and why the flow over the is capped at the amount that would level the two sides. That cap is arithmetic protecting the integrator, not physics.

And the one that is not on the syllabus: momentum. This model solves conservation of mass and uses energy to get a flow rate through an opening, but it never solves conservation of momentum. So the water surface in the basin is assumed flat, and to respond everywhere at once. Real water has inertia, takes time to cross a basin, and piles up where it is pushed. Doing that properly means the shallow-water equations and a two-dimensional model, which Wood Rodgers built and we have not. Every depth here is an average over the basin, not a reading at an address.

Try 12 problems on these numbers →Every answer computed from the model's own constants, with the working shown.

The Cd = 0.6 deserves the same warning. describes a hole in a tank; this is a long box culvert with a partly-raised and sediment in it, where friction along the barrel matters as much as the opening. All of that hides inside one number, and 0.6 is the textbook value for a sharp-edged orifice, not something measured here — which is why the check against BKF's published discharges, and against four days of the real gate, does more for confidence than the derivation.

Limits

What the model cannot tell you

A two-reservoir mass balance is still a small instrument: enough to make the mechanism legible, and nowhere near enough for most of what people reasonably want a flood model to do.

No overland flow routing
The inland side of the embankment is two reservoirs, the basin and the streets, each with a level surface and one pipe between them. Runoff arrives everywhere at once, at the same elevation. There is no travel time down the hillside beyond a single lag for the whole catchment, no street flooding before its neighbor, no flow path at all.
No velocity, no force
Nothing here can say how fast water moves, or whether it would move a car, a trash can or a person. The only speed in the model is the mean velocity implied by the orifice equation at the culvert mouth.
No storm-drain network
Beyond the culvert and the one flap-gated pipe that drains the streets into the basin, there is no pipe network: inlets, catch basins and the rest are not represented. Rain becomes runoff and runoff becomes standing water, with nothing in between.
No groundwater
No infiltration once water is standing, no rising water table under the flat, no seepage through or under the highway embankment.
No sediment, no changing blockage
The culvert's open area is one fixed number for the whole month. In the field, what a culvert passes changes with what is sitting in it, and with the season.
No waves, no wind, no surge
Bay level is the harmonic tide alone. Storm surge, wind setup and wave run-up are the differences between a predicted tide and a bad afternoon, and none of them are here.
No sea-level-rise scenario
Every run uses the same tide. There is no version of this model in which the bay starts a decade higher, which is the scenario that would matter most to the answer.
No depth at an address
The model reports one water level for the basin and one for the streets. The ground is measured, but a single level across every street at 6 m resolution still cannot be read as the depth outside any particular door.

What it does answer

Does the bowl fill while the gate is shut, how far above the street does it get, and how long does it stay there — and what happens to those three answers if you hold water back at the top of the catchment, or lift it over the gate at the bottom. That is a question about a mechanism, which is what this site is arguing about. Why it floods sets it out in full and ends with what the three levers do to it; What is a sponge? is the idea behind the first of them, and six places that built it.

The buildings and the traffic

The buildings are not anybody's house, and the traffic is not a count

Inside the tile, nearly every structure in the 3D model is generic massing, placed procedurally along the street lines so the bowl reads as a neighborhood rather than a contour plot. They are not surveyed structures or photographs of anyone's home. No stand-in represents a specific property, and water shown against a building is not a claim about a real address.

Beyond the tile, where the model draws no flood of its own, the roofs are the real ones: flat, single-return patches read off the same lidar, with the federal road layer and the tree cover beside them, so the neighbors look like themselves. The tile's edge is the line between the two, and it is deliberate. The Sausalito ferry landing, past the end of the harbor data, is drawn by hand where the landing is, and the boat at it is generic.

The restraint has a reason. With one water level for a whole street, a recognizable home shown under water would assert something the model cannot support — and in this community, about these residents, that is not a small thing to get wrong. The model counts how many of its own buildings are taking water because the count says something about the shape of the flood. The address does not exist to be read.

One exception is the Marin Gateway, because the shopping center sits on the flat at the low end of the bowl and its footprint is part of the storage. It is drawn from open data. Its fourteen buildings are OpenStreetMap's footprints, as the Overture Maps Foundation republishes them, at the heights the 2018 lidar measures over their roofs, with the towers and rooftop units the survey shows as solid. The map's footprints sit about a meter and a half west of the roofs the lidar sees, so the two were lined up before either was measured against the other.

The parking lot follows the map too: its parking areas, aisles, sidewalks, crosswalks, drives and drive-throughs, its walls, hydrants, power poles and bus stops. No stall lines are mapped there, so the stalls are set out along the aisles at the standard width and kept inside the mapped parking areas, clear of the walks and crosswalks; on the four aisles that run one way they stand at an angle, as the cars parked there on the survey day do. More accessible stalls than the federal minimum stand by the doors, and the charging stalls number what the map's two charging points take, 18. The trees are the ones the lidar sees on the center's ground, at their measured heights; it catches only three lamp heads, so three lamps are drawn. The big store carries the one piece of branding among the model's buildings, the word Target, because residents asked for the landmark they steer by. No other building carries a name.

The other exception is Golden Gate Village. Its long slabs on the hillside and the rows below them, down to the freeway, are drawn as their real footprints from OpenStreetMap, moved about a meter and a half east to line up with the lidar, and raised to the roof heights the same 2018 survey measures over each one, with the low gables it shows. That is all the model knows about them: their shape and height. Water drawn against one of them is the model's one level for the bowl, the same as anywhere else, not a finding about that building.

The traffic is drawn in the same spirit. The buses are the one exception: they wear the colors and carry the names of the two transit agencies that serve Marin City, so a bus reads as the bus people ride. Every other vehicle is a generic shape. Each follows a simple car-following rule: keep a safe gap to the vehicle ahead, slow for the stop line, wait for a clear turn. It is a picture of how traffic flows, not a count of it.

The buses also run the real routes. Seven lines cross the model: Marin Transit's 17, 22, 36, 71 and 219, and Golden Gate Transit's 120 and 101. Each bus follows its line's path and stops from the agencies' published timetables, the GTFS feeds as the Mobility Database mirrors them (Marin Transit's weekday service for April 13 to August 7, 2026, and Golden Gate Transit's for May 26 to June 12, 2026), and each line's buses come about as often as its midday timetable has them. The timetables give no time at a stop, so a bus waits 20 seconds at each stop, 50 seconds at the Marin City Hub and a minute at a terminus: the 17's in Sausalito, the 219's at Strawberry and in Tiburon, the 120's at Strawberry. The rest of its time between runs passes out of view. The 219 turns around at the foot of Tiburon Boulevard on the loop its timetable's shape draws there, added to the model since the road survey has no road for it, and stands its minute at its stop on the way back. The bus pads beside Highway 101 at the Tiburon Wye are in the model, and buses stop there; the pads at Seminary Drive are not, so buses pass that stop on the freeway without stopping.

The traffic signals and signs are placed by road class: signals where two arterials cross or a freeway ramp crosses one, a yield sign where a ramp merges into an arterial, stop signs on the side streets, and all-way stops where local streets cross. They do not come from a survey of the real intersections, and the model does not claim any real intersection is controlled the way it is drawn.

The photo tool

Measuring depth from a photograph

Set a pixels-per-meter scale from an object of known vertical size, click a feature whose height above the pavement you know, click the waterline on that same object, and subtract. The tool does the arithmetic in your browser.

It is a sound method and easy to get badly wrong. These are the error sources, roughly in order of how much damage each does.

  1. The scale reference must be vertical, and in the same plane as the water. The scale you set is pixels per meter at one distance from the camera. An object nearer than the waterline takes up more pixels per meter than the water, so the depth comes out short in proportion to the ratio of the two distances. If the water is ten meters away and the reference seven, the depth reads about a third too shallow, and nothing in the answer says so.
  2. Camera tilt distorts the vertical scale. Shooting down at the water foreshortens vertical distances in the image, and the tool cannot detect it from a single photograph. Chest height, camera level, looking straight at the reference object. A steep downward angle is the easiest way to be very wrong while the tool reports a confident number.
  3. The waterline is a judgment call. Against a post in moving water there is a wake, a meniscus and usually a shadow, and the line itself is moving. The tool measures where you click. Click it three times and see how far the answer travels — that spread is your real precision, and it belongs in the notes.
  4. The known feature inherits its own error. Depth is a subtraction from the height of a feature above the pavement. If that height is itself estimated, the depth carries the estimate exactly, and no amount of careful clicking recovers it.
  5. Timestamps have to be right to the minute. A depth without a time cannot be paired with a bay level, which is most of what makes it worth having. Phone clocks drift and camera clocks get set in the wrong time zone. Check the metadata against a known clock once per session.
  6. The datum question. A depth is measured from the pavement; a bay level from a datum — MLLW, NAVD88 or mean sea level. Recording which one, every time, is the difference between observations that can be combined and observations that cannot. The model works in NAVD88 meters, so a bay level recorded against NAVD88 compares with it directly; one against MLLW or mean sea level must first be converted with the station's published offsets.

Sources

Sources, and how to check them

The model's own files, the tide station to ask for observed levels, and the nearer station that cannot give them.

The model itself

The original files live in the project's repository, which is not yet public (see Three things you can do), under reference/ — flood-model-3d.html and flood-photo-tool.html, each a single self-contained page. The model has been ported to lib/floodModel.ts, and the constants changed since the port are recorded above. For the equations rather than the prose, read that file: the numbers on this page are imported from it.

NOAA 9414290 — San Francisco, Presidio

The station to use for observed bay levels. Ask it for verified water level, not predictions: it has the long record and the observations. tidesandcurrents.noaa.gov

NOAA 9414806 — Sausalito

Closer to Marin City, and the wrong station for this. It is a subordinate prediction station: it publishes a tide predicted from a reference station, not water that was observed. Predictions miss storm surge, which is exactly what is worth capturing on the day the street floods.

The engineering source this page long lacked. The Marin City Stormwater Plan (October 2025) was prepared for the Marin County Flood Control and Water Conservation District and builds on a Marin City Drainage Study (Wood Rodgers, 2018) and a Southern Marin Watershed Study (2016). It is the authority on this drainage, and this site is not — where the two disagree, the plan is right and this page should be corrected.

What it has already corrected here. This site described the outlet as a nominal 4 × 6 ft opening with a tide gate. The plan documents a 72 by 38 inch box culvert with a sluice gate, “manually operated historically by ” and used “to prevent high tides from into the pond”. The drainage study reconciles the two sizes: the box is 48 inches high and 38 inches is the clear height inside it, with sediment on the floor. The gate is the real correction: it does not close itself. The model treats closure as automatic, which is a simplification, not the mechanism.

What it confirms. The plan calls the watershed “approximately 340 acres” and “bowl-shaped”; the model uses 344 acres and calls it a bowl. The proposed Marin City Pond Flood Reduction Project is a 50 cfs pump station “which would allow the Marin City Pond to drain against higher tides” — the same capacity, and the same purpose, as this model's pump toggle. Neither figure was taken from the plan; both agree with it.

What it corrected, and this was the big one. This page used to say the plan included no catchment delineation, and the model routed all but thirteen acres of 344 into the detention basin. The plan does include one, dividing Marin City in two: a Drake catchment of about 105 acres reaching the pond through the Gateway Shopping Center, and a Phillips catchment of about 194 acres that does not reach it at all — the Phillips pipe joins the same outlet culvert downstream of the pond, so it is “impacted by the tides and not the water level in the Marin City Pond”. The plan puts 145 acres tributary to the pond and says plainly that “roughly half of the watershed drains into the Marin City Pond”. The model was sending about twice that.

What the fix turned out to be, and it was not subtraction. Deleting the Phillips acres more than halves the hours of water on the pavement. It cuts Donahue beside the corner from about 4 hours under in a 25-year storm to 1, and keeps the corner itself out of the water in every storm. That is a lovely result, and it is wrong, because that water really does arrive at the outlet, just past the pond. So Phillips is now a third path: its own catchment, its own lag, and a volume waiting at the culvert that leaves when the tide lets it. Joining below the gate, it takes culvert capacity the pond wanted, so correcting the routing made the flooding worse, not better: a hundred-year storm goes from 6.1 hours on the pavement to 6.7. The old numbers were about right by accident, with two large errors partly canceling.

Two things to hold against this. Phillips is given first call on the culvert, because it enters below the pond's gate and is already in the shared barrel. That is a modeling choice worth about a quarter of the answer. Split the capacity evenly instead and the hundred-year run falls from 6.7 hours to 5.3, and the corner at Drake & Donahue from 4.4 hours to 3.6. Nothing published settles which is right. The choice has odd results in the smallest storms. In the 2-year storm, sponge measures put about half an hour of water over the corner, where the model shows none without them. In the 1-year storm they raise the peak a little too, though not to the corner, and so does a sealing gate. A lower pond lets the tide shut the gate sooner, Phillips water queues behind it, and when the gate opens Phillips leaves first. Split the capacity evenly and neither measure raises the water in any storm. And the water Phillips backs up is held as a volume, not a depth, because this project has no storage–elevation curve for the ground north of the pond and will not invent one — so the model knows that water is waiting, but cannot tell you whose street it is standing on.

Why none of this was caught for months. The three checks this page leans on (the December 2015 gate record, BKF's discharges and the drainage study's Tables 3 and 4) all drive the basin directly and never call the month-long simulation, so each returned byte-identical results before and after this change. “It matches three published datasets” was true the whole time and never evidence about the routing. A fourth check, npm run check:model, now tests the arithmetic of the split and pins what the month run produces — so the next time somebody changes how the water is routed, something fails.

Glossary

Glossary: the words on this site, A to Z

This site borrows its words from engineering reports, because a resident who wants to read the county's own drainage study needs the county's own words. Around the site they are marked with a dotted underline — hover, tap or tab to one, like , and the meaning appears. Here they all are, for anybody who would rather read the list.

acre-foot · acre-feet
The volume that covers one acre to a depth of one foot — about 1,233 cubic meters, or a third of a million gallons. The pond holds about 14 of them before it spills.
backwatering · backwater
When high water downstream backs up into a drain and stops it emptying — or pushes water the wrong way up it. It is why a high tide floods streets that no rain has fallen on.
berm
A raised bank of earth. The one around the pond is what keeps the water in it — until the water gets higher than the bank, which the study puts at 7.5 ft.
bioretention
The general name for planted, soil-based features that hold stormwater and clean it as it filters through — rain gardens and bioswales are both examples.
bioswale · bioswales, swale
A planted channel that carries water slowly along a street, letting some soak in and filtering the rest on the way. A ditch that has been designed rather than dug.
Caltrans
The California Department of Transportation. It owns Highway 101, the embankment and the culvert under it, and the county's plan records the sluice gate as historically worked by Caltrans, by hand.
CEQA
The California Environmental Quality Act. It requires agencies to publish the environmental effects of what they plan to build, and to answer substantive public comments in writing.
cfs · cubic feet per second
Cubic feet per second — the unit US agencies publish flows in. One cfs is about 7.5 gallons (28 liters) a second; this culvert passes a few hundred at its peak.
community services district · CSD, MCCSD
A local public body with an elected board that provides specific services — parks, recreation, some drainage. Marin City has one, and it is the local partner (the "non-federal sponsor") on the Army Corps study.
continuity · conservation of mass
Water in, minus water out, equals the change in what is stored. It is the whole of this model in one sentence, and it is why the size of the basin matters as much as the size of the pipe.
culvert
A pipe or box that carries water under something — here, under the Highway 101 embankment, from the pond to Richardson Bay. Marin City's bowl has one.
datum · vertical datum, datums
The agreed zero that heights are measured from. Get it wrong and every elevation is off by the same amount, quietly, in the same direction.
desilting
Digging built-up silt out of a basin to get its depth back. About $3 million of the federal allocation is reported as going to it at this pond.
detention basin · pond, Marin City Pond
A shallow hollow that holds stormwater for a while and lets it out slowly, instead of sending it all downstream at once. Marin City's is the 3.2-acre pond behind the Gateway Shopping Center.
discharge coefficient
A fudge factor between 0 and 1 that accounts for everything the simple equation ignores — friction, the shape of the entrance, the jet narrowing as it leaves. This model uses 0.6.
eelgrass · seagrass
An underwater flowering plant that grows in shallow bays, holding sediment in place, feeding wildlife and blunting waves. Richardson Bay — where this bowl drains — has beds of it.
Euler's method
Working out how something changes by taking small steps in time: work out how fast the water is rising now, move forward five minutes, repeat. Simple, and it goes wrong if the steps are too big — which is why this model shortens them in heavy rain.
flap gate · duckbill, check valve
A gate hinged so water can only go one way: it swings open when water pushes out and shuts by itself when the tide pushes back. The model's street drain has one; the real gate on the culvert is a sluice gate, worked by hand.
floodwall
A wall built to keep water out of somewhere. Proposed here as a permanent replacement for the temporary barriers currently used at the pond.
head
The height difference driving water through an opening — here, how far the water behind the gate stands above the bay. More head, faster flow.
HEC-RAS · HEC-HMS
Free hydraulic modeling software from the US Army Corps, and an industry standard. The county's drainage study was built in it; this site's model is much simpler and says so.
hydrograph · unit hydrograph, Snyder unit hydrograph
A graph of flow against time — how fast a catchment delivers its rain, and how much later than the rain itself. Real hillsides take hours, which is why this model has a lag in it.
infiltration
Water soaking into the ground rather than running over it. Every sponge measure (see that entry) is an attempt to increase it.
invert
The inside bottom of a pipe or basin — the lowest level water can sit at. The pond's invert was built at 0.7 ft and is now around 3 ft, because silt has filled the difference.
king tide
An unusually high tide, when sun and moon line up at their closest. Not a storm — just the ordinary tide at its extreme, and a preview of where average sea level is heading.
LAFCO
Local Agency Formation Commission — the county body that decides where local government boundaries go. Any attempt to make Marin City a town goes through Marin LAFCO first.
lidar
Ground elevations measured by bouncing laser pulses off the earth from an aircraft. The terrain in this model is USGS lidar at one-meter spacing — measured, not drawn.
MHHW
Mean higher high water — the average of the higher of each day's two high tides. About 5.90 ft NAVD88 here, and the tide level the drainage study pairs its design storms with.
mixed semidiurnal
Two high tides and two low tides a day, of noticeably unequal size. That is the pattern on this coast, and it is why the phrase 'higher high water' has to exist.
MLLW
Mean lower low water — the average of the lower of each day's two low tides. A common zero for nautical charts, and 0.06 ft above NAVD88 at the San Francisco gauge.
NAVD88
North American Vertical Datum of 1988 — the agreed zero that every height on this site and in the county's reports is measured from, so the two can be compared. Its zero is a little below the sea: at the San Francisco tide gauge, average sea level is about 3.2 ft (0.97 m) above it.
NEPA
The federal equivalent of CEQA. Same idea: publish the effects, take comments, respond on the record. The Army Corps expects its study here to produce one.
NOAA Atlas 14
The federal reference for how much rain falls here in a storm of a given rarity. It is where the depths in this model's storms come from, by way of the county's drainage study.
orifice
A hole that water flows through, treated as if the flow depends only on the size of the hole and the height of water behind it. The model treats the culvert as one, which is a simplification.
outfall
The place where a pipe lets its water out — here, where the culvert empties into Richardson Bay. Caltrans plans a second one for the Phillips Drive hillside drain.
permeable pavement
A surface water passes through rather than runs off, laid over gravel that holds it while it soaks away. It looks like paving and behaves like ground.
rain garden
A planted dip that collects runoff from a roof or a road and lets it soak into the ground, instead of sending it to a pipe.
return period · 100-year storm, 10-year storm, 2-year storm, design storm
A way of naming how rare a storm is. A 100-year storm is not one that comes every hundred years — it is one with a 1 in 100 chance in any given year, which over thirty years is about a 1 in 4 chance.
runoff coefficient
The share of rain that runs off a surface rather than soaking in — roughly 0.6 here, meaning six tenths of everything that falls arrives as flow. Sponge measures (see that entry) aim to lower it.
Section 205 · Continuing Authorities Program
A standing federal authority that lets the Army Corps study and build smaller flood projects without a separate act of Congress for each one. Marin City's study runs under it.
sluice gate · slide gate, headgate
A flat gate that slides up and down in a frame to open or close a channel. The one on the Marin City culvert is worked by hand, which is why it matters who shuts it, and when.
spill elevation
The water level at which a basin stops holding and starts overflowing. At Marin City Pond that is about 7.5 ft above the NAVD88 zero, which the study describes as the edge of the pavement.
sponge measures · sponge, sponge city, sponge scenario
Ground and streets built to soak up rain and hold it back — planted ditches, gravel beds, ponds, unpaved yards — instead of sending it all downhill to one drain at once, so it reaches the low streets later and more slowly. Chinese planners called the same idea "sponge city", which is where this site's name comes from. It slows the water; on its own it does not keep the street dry.
spring–neap · spring tide, neap tide
The two-week swing between big tides and small ones, as the sun and moon line up and fall out of line. Nothing to do with the season — 'spring' here means to leap.
stormwater
Rain that has landed on the ground and is on its way somewhere — as distinct from sewage, which goes to a treatment plant in pipes of its own.
surcharging
When a storm drain fills completely and the water in it is pushed up above the pipe, out of the inlets and into the street. A surcharged drain is not a blocked drain; it is a full one.
tailwater
The water level on the far side of an outlet, pushing back. Richardson Bay is the tailwater on this culvert, and when it rises high enough nothing can leave.
the outlet · the drain, the way out
This site's shorthand for the only way water leaves Marin City: the culvert under the Highway 101 embankment and the sluice gate on it. When it is shut, rain that has already fallen has nowhere to go until the tide drops.
tidal constituent
One of the regular cycles that add up to make a tide, each with its own period — the moon's pull at 12.42 hours, the sun's at 12.00, and so on. Add six and you get something that behaves like a real tide.
Torricelli's law
The rule for how fast water leaves a hole: the deeper the water above it, the faster it comes out — but only as the square root, so four times the depth gives twice the speed. Written out, the speed is √(2gH), where H is that depth.
US Army Corps of Engineers · USACE, Army Corps
The federal agency responsible for much of the country's flood-risk work. It is running a $15 million study here, paid for entirely with federal money.
watershed · catchment
All the ground that drains to one point. Marin City's is about 344 acres of hillside and flat, and every drop of it heads for the same low corner.

How to help

How to challenge this

Three measurements would do more for this model than any amount of further modeling. All three are within reach of people who are already here.

  1. 01

    The gate's position, on the day

    The model now uses the county's reported opening, 1.77 m², which matches the discharges BKF published. What nobody publishes is where the gate actually is. The only record of anyone working it is one winter's log, twenty closures between December 2015 and March 2016, and in the four December days that overlap the bay gauge record every reopening was logged at twenty inches — well under the full height. A dated photograph of the gate, or a log of when it is shut, would settle the thing the whole model now turns on.

  2. 02

    Depths paired with observed bay levels

    Depths read off photographs at known times, each matched to the NOAA verified level for that minute, would show whether the model's timing holds: whether water goes over the street, and drains, when the model says it does. Ten or fifteen across one winter, the ask the photo tool makes, is enough to be interesting. Fifty across two is enough to argue with.

  3. 03

    Check the coordinates, and the invert

    The ground is lidar now, so a level is no longer the gap. Two things still are: where these landmarks actually sit — the lidar says at least one of them is in the wrong place — and the culvert invert at the bay end, which nothing published gives. Both are an afternoon's work for somebody who knows the ground.

A finding that contradicts the model is worth more here than one that confirms it. The model is deliberately small and legible — one file of constants, four operations per step — so somebody who knows this ground better than a model does can point at the line that is wrong.

Until then, read it for what it is: an argument about a mechanism, with its assumptions written down where you can see them.