The scheme layer
What you would actually build, and in what order you are allowed to decide it.
What you would actually build, and in what order you are allowed to decide it.
Fourth layer of the pipeline. The first three are NATURAL — they describe how the place works with nobody intervening. This is the first layer that imposes something.
AREA MAPPING --> GEOLOGY --> WATER --> [ SCHEME ] --> [OPTIMISATION]
▲
you are here
Chapters
| ch | chapter | question it answers | status |
|---|---|---|---|
| 1 | Availability | what will the rivers give up, where and when? | built |
| 2 | Aquifer operation | what can the ground take, hold and give back? | built |
| — | Demand | who needs how much, and when? | its own layer — papers/demand |
| 3 | Sizing | what does each size deliver when needed most? | built |
| 4 | Options | realistic basins, no basin, several schemes | built — §3 suspended, see ch.7 |
| 5 | Design | the design rule, and what settling costs | built |
| 6 | Pairing | leakage as a delivery mechanism | built |
| 7 | Reconcile | why two chapters disagree on portfolios | built |
| 8 | Synthesis | single vs portfolio vs cascade, and the shape | built |
| 9 | Pump sizing | what size intake, and how many | built |
| 10 | Drought tests | today, and six continuous drought years | built |
Resolved: the portfolio contradiction was an intake-pump confound
Options reported three rivers beating one by 3.9×. Synthesis found the portfolio losing. The cause was found:
build_scheme_options.pygave every sub-scheme a full 150,000 m³/day intake pump, so a 3-scheme portfolio quietly carried 450,000 against the single scheme’s 150,000. A fix had been written and then silently reverted by a later line-number edit.A single scheme given the same 450,000 delivers 4.57 Mm³ — more than the portfolio’s 4.32. The gain was never about having several rivers; it was pump capacity. Both intake modes are now reported side by side, and at equal total pumping concentration wins by ~5% (the 1/r² leakage penalty on split mounds).
The ~4× gain is real and available — from an intake pump on one river, not from three schemes.
The findings that change the design:
- The resource collapses to 21% of mean in a drought year (ch.1), so the scheme cannot be supplied during a drought. It is a carry-over store and carry-over is its binding specification.
- Carry-over is bought with mound radius, and so is capacity — both go as r². The registry’s 389-day half-life describes a 1 km field; at 2 km it is 1,554 days and 3-year retention goes 14% → 61%. Specify by radius, not by target volume.
- The big rock is not where the big water is (ch.1). A3 is 16 km² with 43 Mm³/yr on a channel 3.5 km away; A1 is 177 km² with 13 Mm³/yr at 5.4 km, and A1’s size advantage is largely notional.
- Demand is not a constraint and never will be. Licensed 3.19 Mm³/yr against ~108 Mm³/yr physically useful on the arable alone (demand).
- The basin is a settling vessel, not a store (ch.5). Its floor is
residence × diversion rate≈ 0.3 Mm³; 10 Mm³ would be needed to stop spilling, which is twice what is buildable. Take a share of the winter surplus. - The INTAKE PUMP dominates everything (ch.4 §1b). 150,000 → 450,000 m³/day takes drought delivery 1.10 → 4.57 Mm³, on the same basin, wells and mound. Injection rate gives 63%, reservoir volume 65%, the portfolio nothing. 86% of the resource arrives Nov–Mar in floods lasting days, so the binding constraint is how fast you can lift water while it is briefly there. This axis had never been swept and is the least investigated in the layer — an intake at that rate is a substantial structure and nothing checks whether channel, licence or ecology would tolerate it.
- Leakage can deliver, but cannot scale (ch.6). The optimum half-life for passive summer release is ~90 days, which forces a 481 m mound holding 0.91 Mm³. Timing and volume are the same r².
- The cascade works (ch.8). Decanting a fast leaky mound into a tight store gives +26% over the same two mounds unlinked.
- 150,000 m³/day is a natural intake unit (ch.9). Capture is exactly linear in pump size to ~200,000 m³/day and bends over above it; three standard units capture 10% more than one large one, because the rivers do not flood together.
- The mature store buys exactly one year (ch.10). Through six stitched drought years, schemes differing 5× in store size deliver identical water from year 2 onward. For multi-year drought, intake capacity beats storage.
The 0.8 is no longer load-bearing. leakage_to_river_fraction
swept 0 → 1 moves every answer by 1–3% and changes no ranking (ch.8).
It remains unsourced; it is no longer a risk.
What changed in the model to support this
Three changes, all in core/model/ and run_model.py, all opt-in so
runs 00–06 are unaffected:
- Seasonal capacity.
stores[i].seasonal_capacity_fractionmakes headroom a monthly series. It has to be: the water table peaks in February and 86% of the divertible resource arrives Nov–Mar, so a static capacity offers full headroom in the month the real aquifer has least room. February is 52% of September on the Chipley record. - Warm start.
--spin-up N,--dump-stateand--warm-startbring the stores to a mature cyclic state before the reported run. The record opens on WY2011, the driest water year in seventeen, so a cold-started run meets the worst drought with empty reserves and no fill season. On run 07 that artefact is worth 62 and 67 percentage points of demand met in 2010 and 2011. recovery_efficiencymoved from injection to recovery, and gained a buffer-zone term. See below — this one changed answers.
The recovery-efficiency correction
Charging
recovery_efficiencyat injection created a ratchet: the unrecoverabledeadpool grew with every deposit, shrank only by leakage, and still consumed headroom. A 66-year spin-up of run 05 ended with 75% of stated capacity dead and the recoverable pool down 86% — a store full of water it could neither deliver nor make room around. That was the model having it both ways, describing water as having drifted beyond the capture zone while still occupying the tank.It is now charged at recovery: each m³ the wells lift delivers
effm³, and the shortfall is booked asrecovery_loss_m3so the ledger still closes exactly.The cycle dependence is not lost, but it runs the other way. The ASR literature is consistent that recovery efficiency improves over successive cycles, because water left by earlier cycles forms a buffer zone against the native groundwater, with the gain per cycle shrinking toward an asymptote. That is now
recovery_efficiency_initial→recovery_efficiencyoverbuffer_volume_m3.The values are placeholders and are marked so. Nearly all quantified ASR recovery efficiencies come from brackish aquifers where recovery is quality-limited; the Sherwood here is fresh, so published first-cycle penalties are probably too harsh. No specific figure for a UK freshwater scheme was found. The North London scheme (~140 Ml/d, ~20 years, run for drought management) is the obvious domestic precedent and its published performance should be read before these numbers are treated as more than a shape.
Separately: UK Chalk ASR is reported to be constrained by double porosity — solutes diffusing from poor-quality matrix water into fresh water stored in the fractures. That is an independent reason to doubt the Chalk here, on quality grounds, on top of the capacity argument in ch.2 §2.
The founding constraint: the reservoir is DERIVED, not chosen
The natural instinct — and the order this project actually built things
in — is to find reservoir sites first, because sites are tangible,
mappable and satisfying to screen for. find_reservoir_sites.py,
coarse_candidates_*.csv and runs 00–06 all exist because of that
instinct.
It is the wrong way round. A reservoir is not a purpose, it is a buffer. Its size, and whether it is needed at all, is whatever remains after you know:
- how much water is available, where, and when
- what the aquifer can accept, hold and return, and when
Only then is there a reservoir requirement, and it is a residual:
AVAILABILITY what the river will give up, by location and day
│
▼
AQUIFER OPERATION what the ground can take and return
│ (rate-limited, headroom-limited, recovery-limited)
▼
THE RESIDUAL when supply and demand cannot be matched
│ through the ground alone
▼
RESERVOIR SPEC volume, and therefore site
Sizing a reservoir before this is answered means picking a number, then building a scheme that justifies it. The sited candidates are not wasted — they become a feasibility check on the requirement (does a site of the needed size exist, where it is needed?) rather than the thing that sets it.
Why the aquifer comes first, specifically
Not seniority — physics and economics:
- The aquifer is a capacitor: large, slow, cheap per m³, and awkward to charge or discharge quickly. Its limits are rates and timing, not volume.
- The reservoir is a buffer: small, fast, expensive per m³, and indifferent to when you use it.
You size the fast, expensive thing around what the slow, cheap thing cannot do. Doing it the other way sizes the cheap resource around an arbitrary expensive one.
The three components
1. Availability — flow at locations
What the river will give up, where, and on which days.
Comes from the water layer. Needs, and does not yet have, river stage and flow at points that are not gauges — that is the unbuilt routing stage. Constraints on top of raw flow: environmental/hands-off flow, abstraction licensing, and the physical intake.
The seasonal fact that governs everything here: surplus arrives in winter, and the aquifer is at its annual maximum in winter (29 of 47 stations peak in Jan–Feb). Availability and acceptance peak together, which is convenient for volume and hostile to headroom.
2. Aquifer operation — the capacitor
From the aquifer layer, and bounded by three things, none of which is total storage:
- headroom — how much room exists when surplus exists (Chalk: 52.8 m at the seasonal high — it passes, but that was not guaranteed)
- acceptance rate — an aquifer that naturally swings 12 m will not take a 50 m mound quietly
- recovery — set by wells, not by polygon area. Water moves ~16 m in the 229-day lag, so drainable volume is a ceiling nobody can reach
Nothing in 14 years of record contains an injection. Every number in this component is bounded, never predicted, and must be labelled so.
3. Reservoir — the residual buffer
Specified last: volume from the residual, then site from volume. Existing candidate sites and stage-volume curves are the feasibility check.
Interfaces
| from | to | what crosses | status |
|---|---|---|---|
| water | scheme | flow at intake points, daily | READY — core.availability.series_at(cfg, E, N), timing good, volume ±15% |
| water | scheme | stage at intake points | not available — a rating does not regionalise |
| aquifer | scheme | headroom, acceptance rate, recovery limit | partial — headroom yes, rates bounded only |
| scheme | water | returned flows, altered baseflow | must not double-count; exchange is signed |
| scheme | aquifer | injected volume, head rise | unvalidatable from record |
The double-counting trap, restated because this is where it bites. Water returned from the scheme to a river, and water credited as aquifer storage, can be the same water. The water layer’s exchange term is signed (
k(h − h_river)) precisely so this cannot happen silently. Run 04 currently credits 80% of leakage back as river baseflow as a flat assumption — that number should become a routed quantity here, not stay a constant.
What already exists, and how it gets re-framed
| exists | was | becomes |
|---|---|---|
find_reservoir_sites.py, candidate screens |
the starting point | feasibility check on a derived requirement |
runs 00–06, run_model.py |
the scheme model | scenario machinery, re-driven by availability |
aquifer_registry.yml (compartments, tiers) |
reference | the capacitor spec |
core/divertible.py, core/constraints.py |
constraints | the availability filter |
Nothing is thrown away. The ordering changes, so the inputs to the reservoir spec change, and the runs get re-driven rather than re-built.
What must be true before this layer can produce a number
- river routing — availability at non-gauge locations
- acceptance-rate bounds — from natural amplitude, stated as bounds
- a demand or objective — there is no scheme without a purpose: flood attenuation, drought resilience, or supply, and they size differently
- the tidal boundary, if any attenuation is claimed — the Levels drain through gates only at low tide
Item 1 is now DONE - core/availability.py exposes
series_at(cfg, easting, northing), returning a daily natural-flow
series with its upstream area, its rainfall source and its bias band
attached. Verified at Bishops Hull: 243.6 km2 against a published
243.5. Item 2 is bounded rather than modelled, which is the honest
best available. Item 3 is yours - there is no scheme without a
purpose, and flood attenuation, drought resilience and supply size
differently. Item 4 only binds if attenuation is claimed.
This layer is now startable.
The objective: DROUGHT MITIGATION
Recorded as a decision, not left open, because it changes what the layer optimises and what accuracy it needs.
Flood mitigation is not a viable objective for this scheme, and the reason is physical rather than modelling. Flood peaks in this catchment are far too large for the storage available, and an aquifer that could absorb them would have to charge very fast and discharge over ~3 months - a combination the rock here does not offer. Fast charge means high transmissivity, which means fast discharge; the capacitor cannot be both. Unless a novel diversion mechanism appears, attenuation is out.
So the scheme layer optimises for drought resilience, and that has three consequences worth stating up front:
- The available model is more accurate than its headline. The
routing bias is ~6% at low flows and -42% at flood peaks. Drought
schemes are decided on low flows, so the useful accuracy is the 6%,
not the 15% average. See
papers/water/river_routing.md. - The tidal boundary stops being a blocker. It only binds if attenuation is claimed. It remains unmodelled and that is now acceptable rather than outstanding.
- The sub-daily timestep drops in priority. It matters for peaks. Drought operates on seasons, so the daily model is the right resolution and the 15-minute stage becomes a nice-to-have.
What now matters most instead: summer low-flow availability, the 229-day surplus-to-deficit lag, aquifer recovery rate (not storage volume), and whether water banked in winter is still there in August.