# lia_geometry: valley reach at the LIA, and model levers (started 2026-11-03)

Goal (user, 2026-11-03): an OGGM set-up that matches the LIA area and volume better
while keeping the present-day fit of the AdaPBS round 2 (a5v10). User's red flag: λ12
matches the area by spreading the change over the whole glacier (accumulation and
ablation area alike), so the glaciers do not reach far enough down the valley (poor
absolute length changes, Leclercq retreat ×0.77, HEF ×0.36).

**Latest: see "Overnight summary (2026-11-04)" at the end.**

**Summary of 2026-11-03 (end of day):**
- User framing: ens118 being closest to the LIA obs is a feature, not a bug: the LIA
  may be a "freak event" that only a few LMR members reach. No need to bring the median
  member to the obs.
- Region-wide, ens118 matches the LIA area (LIA / RGI 1.83 = obs 1.83 over 2212
  outlines; 1.28 vs 1.25 on the 18 test outline groups). It still reaches ~50–60 m too
  little down-valley for outlines > 1 km² and has ~60% of the 1860–1920 retreat.
- Two OGGM geometry defaults are physically wrong and worth changing (tested on 18
  glaciers): the rectangular fallback in the inversion (with λ12 it freezes the width of
  79% of the lower glacier; fix = near-V trapezoid, `adapt`) helps the LIA **area**; the
  valley λ = glacier λ (fix = own valley λ 2–4) helps the **length**. Both cost
  present-day fit in their current form (RGI-date volume too low): not ready as defaults.
- Ruled out as levers: Glen A, lapse rate, precip gradient, snow model, wider AdaPBS
  priors (the present-day targets pin the LIA size).
- Not done: temperature changes (not on the agenda), centerlines + AdaPBS.

Folder `lia_geometry/` (README there):
- `oggm_adapbs/`: clone of `fmaussion/oggm@adapbs` at **6af974ca** (the adapbs commit
  rebased on master 57af814, incl. #2026 SfcType speed-ups). Used via PYTHONPATH with
  the oggm_env python on the login node (the installed OGGM cannot read delta trees),
  and pip-installed at that commit in the slurm jobs. Gives the same HEF run as the
  round 7 particle (dmdtda −1129.2 = the stored z).

## Step 1: terminus elevation, model vs outlines (`extract_geometry.py`, `terminus_analysis.py`)

- `extract_geometry.py` reads the L5 state tree `states/a5v10_1850` (all 3892 glaciers,
  ~40 min on the login node, 7 procs, gdirs in /tmp and deleted per bundle) ->
  `out/geometry_<bundle>.pkl`: per glacier the flowline (bed, surface, area per grid
  point) at the RGI date, in 1850 and in the max-area year 1850–1875 of each of the 5
  states, plus, for the largest RGI glacier of each main LIA outline, the LIA outline and
  the group's RGI outlines rasterised on the gdir DEM (COPDEM GLO-30): area per 10 m
  bin, min / median elevation.
- `terminus_analysis.py` -> `out/terminus_groups.csv`, `out/terminus_summary.csv`,
  `figs/terminus_<state>.png`.
  - Vertical reference: the obs use today's DEM (ice-free ground below the old tongue,
    today's surface inside the RGI outline). Like for like, every model grid point is
    put at its **RGI-date surface** (== the valley floor downstream), default `VERT=rgi`.
    `VERT=own` (each state's own ice surface, `*_own.*`) is biased up by the ice
    thickness and gave a misleadingly good picture (gain profile ≈ the obs).
  - Model RGI-date zmin is ~20 m above the obs one (elevation-band discretisation).

**Results (2026-11-03), 2212 LIA groups:**

| outline size (km²) | n | terminus lowering LIA − RGI, obs | ens118 | ens083 | gain below RGI zmin, obs | ens118 |
|---|---|---|---|---|---|---|
| < 0.5 | 932 | −113 | −256 | −190 | 52% | 90% |
| 0.5–1 | 452 | −252 | −240 | −162 | 52% | 81% |
| 1–5 | 671 | −289 | −241 | −172 | 45% | 72% |
| 5–20 | 143 | −325 | −265 | −215 | 30% | 64% |
| > 20 | 14 | −295 | −250 | −205 | 17% | 64% |

(medians of the lowering; the gain share is summed area.) LIA area of these groups: obs
3796, ens118 3781, ens083 3249 km².
- Above 1 km², the model terminus falls short by ~50–60 m (ens118, the largest state)
  to ~110 m (ens083, the median state): ~20–35% too little vertical reach. Small
  glaciers (< 0.5) overshoot (the known overgrowth).
- **The user's hypothesis holds half-way.** The model does not reach far enough, but
  it does not compensate by spreading the gain over the glacier either: outlines
  > 5 km², gain below / above the RGI terminus elevation: obs 157 / 408 km², ens118
  321 / 184, ens083 246 / 128. The model piles the area into a fat tongue in the first
  ~100 m below today's snout (`figs/terminus_ens118.png` c), i.e. the λ12 valley
  trapezoid, and gains too little in place (the observed LIA glacier was wider /
  thicker over ~1000 m above today's terminus).
- Panel (a): per outline the scatter is large (r small); the deficit is systematic for
  the large outlines.

## Code finding: the valley is a λ12 trapezoid too

`init_present_time_glacier` appends the downstream line with the glacier's λ (12) and a
bottom width w0 fit to the valley cross-section with that λ, clipped at 50 m
(`trapezoid_min_bottom_width`). With λ12 the clip is hit (HEF: w0 = 50 m on the whole
downstream line), so the modelled valley is wider than the terrain: a 100 m thick tongue
is 1250 m wide. SemiImplicit supports per-point λ, so the valley λ can differ.

## Step 2: lever tests on single glaciers (`glacier_lab.py`, `lab_calib.py`)

`glacier_lab.py`: one glacier from the AdaPBS L4 (a5v10 top particle, HIST ens010),
1500 -> 2025, with levers: `lam_ds` (valley λ, w0 refit), `w0_min`, `lam_gl` (glacier λ:
re-inversion with glen_a refit to the reference volume, then a new model flowline),
`glen_a_fac`, `temp_grad` (lapse rate), `pgrad` (precip gradient, fraction / 100 m
around the mean glacier elevation), `snow` (SfcTypeTIModel, monthly).
`lab_calib.py`: AdaPBS with exactly the a5v10 options, forward = glacier_lab.run.

HEF, a5v10 particle, no recalibration: LIA terminus 2352 m (valley λ12) vs 2190 m
(valley λ2); obs LIA min elevation 2243 m, RGI 2413 m. But with λ2 the RGI-date glacier
is 2 km too long, so every lever has to be recalibrated.

**Round A (submitted 2026-11-03 ~13:00):** 18 test glaciers (`test_ids.txt`: the 17
Leclercq records + Aletsch) × configs, 2 jobs per config (`submit_lab.sh`,
`run_lab_slurm.sh`) -> `calib/<RGI>_<config>.nc`; `lab_analyse.py` ->
`calib/lab_summary.csv`.

| config | levers | jobs |
|---|---|---|
| ref | – | 593117 / 593118 |
| vds2 / vds4 / vds6 | lam_ds 2 / 4 / 6 | 593119–20 / 593123–24 / 593121–22 |
| lg2 / lg4 / lg6 | lam_gl 2 / 4 / 6 (valley the same) | 593135–36 / 593137–38 / 593139–40 (first try 593129–34 cancelled: the 8 workers redid the inversion at once and corrupted settings_lam*.yml; now done once in the main process) |
| glena05 / glena2 | glen_a_fac 0.5 / 2 | 593109–10 / 593107–08 |
| tg50 / tg80 | lapse rate −0.0050 / −0.0080 | 593115–16 / 593127–28 |
| pg05 / pg10 | pgrad 5% / 10% per 100 m | 593111–12 / 593125–26 |
| snow | SfcTypeTIModel | 593113–14 |
| ad02 / ad02v4 / ad02v2 / ad02l6 | adapt 0.2 (+ lam_ds 4 / 2; + lam_gl 6) | 593204–05 / 593206–07 / 593208–09 / 593210–11 |

### Round A results (2026-11-03, 13 configs done; snow and adapt pending)

`lab_analyse.py` (top particle per glacier; medians over the 18 glaciers):

| config | all 3 targets within 1σ | retreat LIA -> last obs / Leclercq | LIA terminus − outline (m) | RGI terminus − obs (m) | LIA / RGI area |
|---|---|---|---|---|---|
| ref | 67% | 0.57 | +43 | −23 | 1.16 |
| vds2 / vds4 / vds6 | 44 / 50 / 44% | 0.74 / 0.71 / 0.69 | −9 / +13 / +29 | −69 / −64 / −30 | 1.11 / 1.13 / 1.14 |
| lg2 / lg6 | 28 / 50% | 0.81 / 0.65 | −22 / +8 | −41 / −45 | 1.11 / 1.15 |
| glena05 / glena2 | 33 / 28% | 0.53 / 0.60 | +118 / +5 | +4 / −57 | 1.14 / 1.18 |
| tg50 / tg80 | 33 / 56% | 0.60 / 0.46 | +11 / +84 | −57 / −2 | 1.19 / 1.13 |
| pg05 / pg10 | 83 / 72% | 0.50 / 0.49 | +58 / +48 | −26 / −31 | 1.15 / 1.14 |

- Only the geometry levers move the reach. Glen A, lapse rate and the precip gradient
  don't (retreat ratio 0.46–0.60); glen A and the lapse rate cost present-day fit. The
  precip gradient keeps the fit (better than ref) but does nothing for the LIA.
- The narrow valley over-shoots some glaciers (Aletsch LIA terminus 981 m with valley
  λ2, 700 m with λ2 everywhere, obs 1428; Rhône, Pasterze lengths), and still leaves
  Hintereis, Gries, Unteraar, Wurten, U Grindelwald short. So a valley λ of 4–6, not 2.
- The RGI-date terminus sits 40–70 m too low with the narrow valley: the long tongue
  has not retreated enough by 2003 (area z +0.5–1).
- `figs/lab_lengths.png` (lengths vs Leclercq, ref / vds2 / lg2 / pg10).

**Timing: the model has ~25% of the 1860–1920 retreat in every config.** Median over 15
Leclercq glaciers, length change (m), 1860–1920 / 1920–1970 / 1970–2000: obs −614 /
−679 / −211; ref −160 / −300 / −336; vds2 −84 / −536 / −576; lg2 −168 / −500 / −512.
The forcing has no sustained warming then (HEF ens010 JJAS vs 1961–1990: 1840–59
−0.66 K, 1860–79 −0.32, 1880–99 −0.43, 1900–19 −0.52; winter P flat). The longer
tongues make the late, abrupt retreat worse. This is the known "end of the LIA" problem
(black carbon / dry winters), not geometry.

**Where the LIA area is gained, per config (`lab_hypso.py` -> `calib/lab_hypso.csv`,
top particles rerun with geometry).** 5 single-glacier outlines (Pasterze, Gepatsch,
Gries, Rosenlaui, Rotmoos), gain below / above the RGI terminus elevation (km²): obs
4.7 / 12.4; ref 5.3 / 5.7; vds4 4.0 / 5.0; lg6 3.8 / 6.4; lg2 4.8 / 2.3; pg10 3.8 /
5.4. The valley gain is right; **the in-place gain is half the observed in every config.**

### Why: λ12 makes the tongue rectangular

`mass_conservation_inversion` solves a trapezoid with h <= w / λ (bottom width >= 0);
where the flux needs thicker ice, it falls back to a **rectangle** (λ = 0), which never
widens when it thickens. With λ12 a 1 km wide band can't be thicker than 83 m. On the
18 test glaciers, 28% of the area and **79% of the lower half of the flowline (by
position) is rectangular** (HEF: grid points 19–50 of 51, the whole lower glacier; Aletsch,
Mer de Glace, Rhône, Argentière: 100% of the lower half). So λ12 widens the thin upper
basins and freezes the tongue width: the opposite of the LIA geometry. HEF LIA
thickening (ref) up / mid / low third 11 / 48 / 84 m, widening of the lower third 354 m.

New lever `adapt=α` (`glacier_lab._adapt_rect`): no rectangle; those points get a
trapezoid with bottom width α·w and their own λ_i = (1−α) w / h; the SIA thickness
scales by (2/(1+α))^(1/(n+2)) (checked: α = 1 gives OGGM's rectangle exactly, apart from
the filtered terminus points), glen_a refit to the reference volume. HEF α 0.2: λ_i
3.5–9.6, uncalibrated LIA area 10.9 -> 11.5 km² (with valley λ4: 12.1, terminus 2319 m).

**Snow model (SfcTypeTIModel, monthly buckets, snow melt_f 0.5× ice), recalibrated:** all 3
targets 50%, retreat ratio 0.44, LIA terminus +79 m, LIA / RGI area 1.13, posterior melt_f
4.5 / prcp_fac 2.25. Runs ~2× slower. No help for the reach or the area. Length change
1860–1920 / 1920–1970 / 1970–2000 (median, 15 glaciers): snow −138 / −396 / −312, pg10
−208 / −402 / −208, tg80 −156 / −384 / −134, lg6 −192 / −420 / −416 (obs −614 / −679 /
−211): **no lever gives the 1860–1920 retreat.**

### Adaptive trapezoid (adapt 0.2) results, and the trade-off (2026-11-03 ~14:45)

| config | all 3 within 1σ | retreat ratio | LIA terminus − outline | LIA / RGI area (18) | single outlines: in place / valley (obs 12.4 / 4.7) |
|---|---|---|---|---|---|
| ref | 67% | 0.57 | +43 m | 1.16 | 5.7 / 5.3 |
| ad02 | 44% | 0.38 | +108 m | 1.21 | 8.3 / 6.9 |
| ad02v4 | 44% | 0.47 | +66 m | 1.20 | **12.5** / 2.0 |
| ad02v2 | 39% | 0.47 | +65 m | 1.20 | 12.0 / 2.3 |
| ad02l6 | 56% | 0.63 | +57 m | 1.18 | 7.4 / 4.4 |

- The adaptive trapezoid fixes the in-place gain (ad02v4 matches the outlines), but the
  tongue then widens instead of advancing: reach gets worse.
- **Trade-off (`figs/lab_tradeoff.png`):** all configs lie on one frontier from long /
  narrow (lg2: retreat 0.81, LIA/RGI 1.11) to wide / short (ad02: 0.38, 1.21). The
  outlines need both (single-glacier outlines: LIA/RGI 1.36, retreat 1.0). With the
  present-day MB, area and volume fixed by the calibration, the LIA glacier has a fixed
  amount of extra ice; geometry only decides how it is spent.
- **Not a calibration ridge either:** among the particles that fit today (|z| < 1.5 on
  all 3), LIA/RGI area spans only 1.17–1.19 (P10–P90, ref median over glaciers), with
  prcp_fac varying ~2× (ρ(prcp_fac, LIA size) 0.78, but tiny range).
- So more LIA ice is needed: a larger LIA−today MB difference (temperature sensitivity
  or forcing), which none of the MB levers tested (lapse rate, precip gradient, snow
  model) delivers. Combined with the missing 1860–1920 retreat, the forcing (or a
  missing process: black carbon / dry winters / sub-monthly melt) is the main suspect.

Candidates for the next round (not started): pseudo-daily melt (temperature variability
within the month), a temp_melt / sensitivity lever, and running a geometry combination
(adapt + valley λ4–6) regionally once the MB side is sorted.

## Step 3 (user's go, 2026-11-03 ~15:00): does a bigger LIA state (ens118) help?

User's idea: climate alone can't explain the LIA (GRL 2022, doi 10.1029/2022GL100363);
ens118 gives a bigger LIA and an early, sustained retreat. Options under discussion
(not started, user decides): (i) more low-frequency variance in the LMR members, (ii) a
blanket pre-1850 cooling of all members (ramped out, NAT == HIST before 1850 keeps it in
both; recalibrate AdaPBS on it; the share will drop because L grows and A hardly
changes).

**All the round A lever tests ran on HIST ens010** (the calibration member, ~P54–P59
of the 1850 states). The region-wide terminus analysis used the 5 states.

**Member lengths vs Leclercq, no new runs (`member_lengths.py` ->
`members/member_lengths_ens_v8_adapbs_a5v10.csv`):** 15 glaciers, 192 HIST members of
round 7, median length change (m):

| | 1860–1920 | 1920–1970 | 1970–2000 | retreat ratio (LIA max -> last obs) |
|---|---|---|---|---|
| obs | −614 | −679 | −211 | 1 |
| ens023 / 083 / 010 | −70 / −114 / −160 | −300 / −312 / −300 | −264 / −336 / −336 | 0.53 / 0.53 / 0.57 |
| ens118 | −350 | −396 | −264 | 0.65 |
| members P5–P95 | −342 to −104 | −396 to −268 | | 0.47–0.61 |

- Across members the 1860–1920 retreat scales with the corrected LIA area: −43 m per
  100 km² (r −0.81); the retreat ratio +0.021 per 100 km² (r 0.72). At the observed
  4248 km² that gives −388 m and 0.62; matching −614 m would need ~4770 km² (+12% over
  the outlines). **A bigger state alone can't match both the LIA area and the retreat;
  it needs geometry that turns the extra ice into length.**
- 1920–1970 is also half the observed in every member: the "fine after 1925" assumption
  does not hold with the current model (the lag persists; 1970–2000 retreats too much,
  missing the 1970s–80s readvance).

**Round B: the lever test on ens118 (`member=118`, recalibrated).** glacier_lab now
reads the L5 state tree (holds the 5 state climates; ens010 runs are identical). HEF
uncalibrated: ens118 LIA 11.7 km² / +1500 m vs ens010 10.9 / +1200.

| config | levers | jobs |
|---|---|---|
| ref_m118 / vds4_m118 / lg4_m118 | member 118; + lam_ds 4; + lam_gl 4 | 593238–39 / 593240–41 / 593242–43 |
| ad02v4_m118 / ad02v2_m118 | + adapt 0.2, lam_ds 4 / 2 | 593244–45 / 593246–47 |
| ad02l6_m118 / ad02l4_m118 | + adapt 0.2, lam_gl 6 / 4 (valley the same) | 593248–49 / 593250–51 |

### Round B results (ens118, recalibrated; 2026-11-03 ~17:20)

`lab_analyse.py`, `lab_analyse.periods()` (-> `calib/lab_periods.csv`), `lab_hypso.py`;
`figs/lab_tradeoff.png` now has both rounds.

| config | all 3 within 1σ | retreat ratio | Δlength 1860–1920 / 1920–70 / 1970–2000 (obs −614 / −679 / −211) | LIA terminus − outline | LIA / RGI (18) | 5 single outlines: A_LIA (obs 65.2), valley / in place (obs 4.7 / 12.4) |
|---|---|---|---|---|---|---|
| ref (ens010) | 67% | 0.57 | −160 / −300 / −336 | +43 m | 1.16 | 59.4, 5.3 / 5.7 |
| ref_m118 | **72%** | 0.68 | −372 / −396 / −402 | +13 m | 1.21 | 62.2, 7.2 / 6.3 |
| vds4_m118 | 61% | 0.82 | −288 / −672 / −528 | −12 m | 1.16 | 60.6, 5.6 / 5.6 |
| lg4_m118 | 50% | **0.93** | −396 / **−684** / −420 | +17 m | 1.18 | 59.6, 6.2 / 5.8 |
| ad02l4_m118 | 39% | 0.81 | −316 / −448 / −520 | +17 m | 1.21 | 63.1, 7.0 / 6.3 |
| ad02l6_m118 | 44% | 0.70 | −268 / −416 / −342 | +26 m | 1.23 | 63.0, 5.9 / 9.5 |
| ad02v4_m118 | 44% | 0.65 | −256 / −416 / −336 | +53 m | 1.25 | 64.4, 8.4 / 9.6 |
| ad02v2_m118 | 39% | 0.71 | −192 / −416 / −228 | +22 m | 1.25 | **64.6**, 7.5 / 9.8 |

- **The bigger state moves the whole frontier out.** ens118 alone already improves every
  metric and the present-day fit (72% vs 67%).
- With ens118 the geometry levers get close to the observations on one axis each:
  glacier+valley λ4 gives 93% of the Leclercq retreat and the observed 1920–1970
  retreat; adapt + valley λ2 gives the observed LIA area of the single outlines. No
  config gets both, and the geometry configs lose present-day fit (39–61%, mostly volume
  too low at the RGI date: z_vol −0.6 to −0.8).
- The 1860–1920 retreat stays at ≤ 2/3 of the observed in every config (best −396 m),
  and 1970–2000 retreats too much (the 1970s–80s readvance is missed).
- So a larger LIA state (options i / ii) is the main lever, and it makes the geometry
  levers useful. Next: decide (i) vs (ii); then a geometry choice between λ4 everywhere
  and adapt + narrow valley, with a fix for the RGI-date volume deficit.

### Wide AdaPBS priors, reference set-up (user, 2026-11-03 ~17:30)

No model change (ens010, λ12): only the prior bounds, `lab_calib.py --mf_range 4
--pf_range 4 --tb_range 4` (a5v10: 2 / 2 / 2): melt_f and prcp_fac static ÷4 .. ×4,
temp_bias static ± 4 K, logit-normal sd 1 as before.
- `wide`: 100 particles × ≤ 6 iterations (as a5v10), jobs 593265 / 593266;
- `wide_n200`: 200 × ≤ 8, jobs 593267 / 593268.
- **Result (2026-11-03 ~19:15): wide priors change nothing for the LIA.**

  | | all 3 within 1σ | retreat ratio | LIA terminus − outline | LIA / RGI (18) | Δlength 1860–1920 / 1920–70 / 1970–2000 | median melt_f / prcp_fac / temp_bias (top particles) |
  |---|---|---|---|---|---|---|
  | ref (a5v10 prior) | 67% | 0.57 | +43 m | 1.16 | −160 / −300 / −336 | 4.12 / 2.47 / −0.08 |
  | wide (100 × 6) | 67% | 0.57 | +13 m | 1.16 | −210 / −300 / −342 | 3.84 / 3.08 / +0.37 |
  | wide_n200 (200 × 8) | 67% | 0.55 | +46 m | 1.16 | −200 / −300 / −336 | 3.51 / 3.20 / +0.89 |

  - The posterior slides along the ridge (higher prcp_fac, warmer temp_bias, lower
    melt_f), with almost no weight at the new bounds (prcp_fac 7%, as before).
  - Among the particles fitting today (|z| < 1.5 on all 3), prcp_fac spans 1.2–4.8 with
    the wide prior (1.9–3.7 before), but LIA / RGI area only 1.16–1.18 (P10–P90, median
    over glaciers). **The present-day targets pin the LIA size; no prior width frees it.**

**Observed LIA / RGI area for the trade-off figure (2026-11-03):** no exact equivalent,
because the x axis sums one RGI glacier each while most outlines hold several. The 18
test glaciers' outline groups: 1.25 (379 / 304 km²); the 5 single-glacier outlines
1.36; outlines with ≤ 2 RGI glaciers 1.34. On the same 18 groups, the region-wide ens118
state (round 7, all glaciers of the group) gives 1.28 and ens083 1.21. Region-wide (2212
groups): obs 1.83, ens118 1.83, ens083 1.57 (small-glacier overgrowth compensates).
Shaded in `figs/lab_tradeoff.png` (1.25–1.36).

## Overnight 2026-11-03/04 (user's go): forcing, centerlines, bigger sample, ELA

New code (all in `lia_geometry/`, README to update):
- `glacier_lab.py` levers: `tpert=<name>` (yearly dT from `forcing/<name>.csv`, added to
  every month; `TPertTIModel`), `cl=1` (centerlines: `setup_centerlines()` builds them from
  OGGM's L2 `tests_incr/default_dx/centerlines` (border 160, OGGM default λ 2), with the
  climate / observations / static calibration of the elev-band gdir, inversion with glen_a
  refit to the same reference volume, FluxBasedModel), `vol_fac` (inversion volume ×
  factor, glen_a refit; lab_calib scales the volume target too).
  HEF checks (a5v10 particle, no recalibration): ens010 LIA 10.9 km² / 2352 m / +1.2 km;
  ens010 −0.2 K 11.9 / 2334 / +1.6; ens118 −0.2 K 13.0 / 2302 / +2.0; centerlines 10.0 /
  2285 / +2.4 (obs group 15.3 km², 2243 m, Leclercq ~+2.9 km). Centerline run 9–20 s
  (elev bands ~3 s).
- `make_tpert.py` -> `forcing/cool01..03` (−0.1..−0.3 K before 1850, ramp to 0 at 1900),
  `forcing/lfmc00..19` (LMR v2.1 MC-run deviation from the MC mean, 31-yr mean, same ramp;
  1800–1849 mean spread std 0.15 K, range ±0.24 K).
- `lf_regional.py` + `run_lf_slurm.sh`: Alps-wide forward runs, a5v10 params, no
  recalibration (as round 7); `base010` == round 7 ens010 exactly (checked).
  `lf_analyse.py` -> `regional/<tag>/summary.csv`, `figs/lf_<tag>.png`.
- `sample_forward.py` + `run_fwd_slurm.sh`: top particles of calibrated configs rerun with
  ens010 / ens118, ± cool02 (the round 7 way: calibrate on ens010, run all members).
- `ela_check.py`: model ELA (MB = 0 on a height grid, a5v10 particle), periods
  1820–49 / 1850–79 / 1971–90 / 2000–19 -> `out/ela_<ids>.csv`.
- `single_ids.txt`: the 357 single-RGI-glacier outlines > 1 km² (obs LIA / RGI 1.78;
  round 7 ens118 1.59, ens083 1.44); `sample_ids.txt` = these + the 18 test glaciers (370,
  shuffled).

Jobs:

| what | job |
|---|---|
| Alps-wide forcing set `v1`: base010, base118, ens010 cool01/02/03, ens118 cool01/02, ens010 + lfmc00..19 (27 exps) | 593317 (40 chunks) |
| centerlines + AdaPBS, 18 test glaciers, ens010 (`cl`) / ens118 (`cl_m118`) | 593357–62 / 593363–68 |
| 370-glacier sample, AdaPBS on ens010: `s_ad02l4` (no-rect + λ4), `s_ad02v4` (no-rect + valley λ4), `s_lg4` (λ4), `s_vol120` (volume +20%) | 593372 / 593371 / 593369 / 593370 (arrays of 20) |
| follow-up forward runs of those + a5v10 with ens010 / ens118 ± cool02 (`forward/s1/`) | 593449 (afterany) |

**ELA (done):** median model ELA rise from 1820–49 to 1971–90 / 2000–19: ens010 +76 / +283
m, ens118 +121 / +324, ens010 −0.2 K +107 / +314, ens118 −0.2 K +152 / +355 (18 test
glaciers; the 370-glacier sample: +79 / +118 / +110 / +149 to 1971–90). Literature to
compare (not checked here): ~+100 m LIA -> 1971–90 is the figure I recall (Maisch,
Zemp et al. 2007): ens010 low, ens118 at or above it.

### Result: Alps-wide forcing set v1 (job 593317, done 2026-11-03 ~23:30)

3815 glaciers (2 dropped for a failed run in some exp, 20 failed runs of 103k), a5v10
params, no recalibration. `lf_analyse.py v1` -> `regional/v1/summary.csv`,
`figs/lf_v1.png`. LIA area / volume corrected as round 7 (ens010 corrected + raw
difference); terminus lowering from length + RGI-date surface (outlines > 1 km²; obs −293 m,
> 5 km² −324 m).

| exp | LIA area (4248 ± 217) | LIA vol (285 ± 44) | ΔV LIA -> 2015 (180 ± 39) | A 2003 (RGI 2082) | dV 2000–20 (km³) | retreat ratio | Δlength 1860–1920 / 1920–70 / 1970–2000 (−614 / −679 / −211) | single outlines LIA/RGI (1.78) | terminus lowering > 1 / > 5 km² |
|---|---|---|---|---|---|---|---|---|---|
| base010 | 3797 | 208 | 113 | 2084 | −39.6 | 0.57 | −160 / −300 / −336 | 1.45 | −143 / −148 |
| base118 | 4307 | 237 | 138 | 2148 | −41.3 | 0.65 | −350 / −396 / −264 | 1.56 | −205 / −177 |
| ens010 −0.1 K | 4162 | 228 | 129 | 2165 | −41.7 | 0.56 | −268 / −414 / −264 | 1.52 | −187 / −169 |
| ens010 −0.2 K | 4531 | 248 | 146 | 2207 | −42.8 | 0.67 | −312 / −528 / −264 | 1.60 | −225 / −193 |
| ens010 −0.3 K | 4883 | 267 | 164 | 2229 | −43.3 | 0.73 | −416 / −528 / −336 | 1.67 | −263 / −221 |
| ens118 −0.1 K | 4703 | 258 | 156 | 2202 | −42.7 | 0.70 | −420 / −528 / −264 | 1.64 | −250 / −198 |
| ens118 −0.2 K | 5078 | 279 | 175 | 2228 | −43.3 | 0.76 | −468 / −528 / −264 | 1.73 | −284 / −230 |
| ens010 + LMR MC anomalies (20) | 3246–4731 (median ~3800) | 178–259 | 84–156 | | | 0.39–0.70 | 0 to −350 / | 1.30–1.65 | |

(The terminus lowering here is from length and the RGI-date surface along each glacier's
own flowline; terminus_analysis.py's −250 m for ens118 used the 1850–1875 state geometry.
Same method across exps, so compare within this table.)

- **LIA area is linear in the pre-1850 offset: ~+370 km² per 0.1 K** (ens010). The
  observed 4248 needs ens010 −0.12 K; ens118 is already there (its own noise ≈ −0.14 K).
- **LMR's own low-frequency uncertainty spans the observed LIA:** of the 20 MC-run
  anomalies on ens010, 3 exceed 4248 (mc09 4435, mc10 4543, mc19 4731) and 5 reach the
  obs 1σ range (≥ 4031; corrected 2026-11-04, was "4 more within 1σ"). Round 7 members:
  2 of 192 ≥ 4248, 24 within 1σ. So the observed LIA is a ~15% event under LMR uncertainty: the
  user's "freak event" is plausible without changing the central reconstruction.
- Volume and ΔV need more: obs ΔV LIA -> 2015 180 ± 39 is reached only from ~−0.2 K on
  ens118 (175) or −0.3 K on ens010 (164), where the area overshoots (5078 / 4883). The
  model's LIA glaciers are thinner than Reinthaler's (known).
- 1860–1920 retreat: best −468 m (ens118 −0.2 K) vs −614. Timing matters: ens118 retreats
  more than ens010 + cooling at the same LIA area (its cold is concentrated just before
  1850, so 1850 is further out of balance).
- **The size distribution stays wrong:** even where the regional area overshoots, the
  single-glacier outlines > 1 km² stay below the obs (1.67–1.73 vs 1.78) and the large
  outlines' terminus lowering stays short (−230 vs −324 m for > 5 km²). The regional total
  is propped up by small-glacier overgrowth. That part is structural (geometry), which
  is what the no-rectangle / valley-λ fixes target.
- No recalibration: a pre-1850 cooling leaves the glaciers too large in 2003 (A +3–7%) and
  losing too much in 2000–20 (−42 to −43 vs −39.6 km³ base; obs ~−37 ± 5). Any adopted
  forcing change needs AdaPBS rerun on it.

### Result: present-day fit of the geometry configs on the 370-glacier sample (2026-11-04 ~01:00)

All 370 calibrated per config (0 failed). Top particle, area-weighted, 278 glaciers common
to all (incl. round 7's a5v10 calibration of the same glaciers):

| config | MB within 1 Hugonnet σ | area within 10% | median volume error | ΣMB mod / obs |
|---|---|---|---|---|
| a5v10 (round 7) | 94% | 83% | −11% | 1.06 |
| s_ad02l4 (no-rect + λ4) | 93% | 85% | −18% | 1.07 |
| s_ad02v4 (no-rect + valley λ4) | 89% | 85% | −17% | 1.07 |
| s_lg4 (λ4) | 92% | 84% | −17% | 1.06 |
| s_vol120 (volume +20%) | 91% | 76% | −13% (of the +20% target) | 1.08 |

The strict "all 3 within the calibration σ" fractions (0.2 Hugonnet σ) look bad on this
sample for every config (a5v10 19% by count, 41% by area; geometry configs 9–12% / 23–32%),
but in physical units the geometry configs fit today almost as well as a5v10; their cost is
~6 points more RGI-date volume deficit.

### Result: sample forward runs (`forward/s1`, job 593449, done 2026-11-04 ~01:00)

`sample_analyse.py s1` -> `forward/s1/summary.csv`. Top particles calibrated on ens010,
rerun with ens010 / ens118 ± cool02 (no recalibration). 357 single-glacier outlines
(obs LIA/RGI 1.78; terminus lowering > 5 km² −354 m) + Leclercq (15 records):

| geometry, forcing | LIA/RGI | median ln(A_LIA mod/obs) | LIA terminus − outline | lowering > 5 km² | retreat ratio | Δlength 1860–1920 / 1920–70 / 1970–2000 | mass change 2000–20 (obs −828) |
|---|---|---|---|---|---|---|---|
| a5v10, ens010 | 1.45 | −0.25 | +119 | −159 | 0.57 | −160 / −300 / −336 | −870 |
| a5v10, ens118 | 1.56 | −0.13 | +76 | −196 | 0.65 | −350 / −396 / −264 | −884 |
| a5v10, ens118 −0.2 K | **1.73** | **0.00** | **+12** | −259 | 0.76 | −468 / −528 / −264 | −901 |
| no-rect + valley λ4, ens118 −0.2 K | 1.72 | −0.01 | −25 | −286 | 0.68 | −316 / −624 / −252 | −1004 |
| no-rect + λ4, ens118 −0.2 K | 1.58 | −0.08 | −43 | **−375** | **1.05** | −560 / −496 / −416 | −944 |
| λ4, ens118 | 1.43 | −0.24 | +19 | −307 | 0.93 | −396 / **−684** / −416 | −896 |
| λ4, ens118 −0.2 K | 1.54 | −0.13 | −54 | −395 | 1.07 | **−630** / −868 / −420 | −923 |
| vol +20%, ens118 −0.2 K | 1.68 | −0.03 | +45 | −250 | 0.66 | −414 / −504 / −352 | −941 |

- **The forcing is the area lever, the geometry is the length lever.** With the bigger LIA
  forcing (ens118 −0.2 K), the round 7 geometry already matches the single-glacier
  outline area (median ln ratio 0.00) and the LIA terminus elevation (+12 m).
- λ4 (with or without rectangles) gives the observed retreat / reach but ~10% less LIA
  area. The no-rectangle change on top of λ12 (ad02v4) is roughly neutral on area on
  this bigger sample (the 18-glacier "in-place" gain does not carry over clearly) and
  costs reach: **not a clear win here**.
- +20% inversion volume: no benefit.
- The cooled runs lose too much mass today (−900 to −1000 vs −828) because they were not
  recalibrated on the cooled forcing (the glaciers are still too big in 2000). Any
  adopted forcing needs an AdaPBS rerun on it.

### Result: centerlines + AdaPBS (partial: 9 of 18 glaciers, 2026-11-04 ~01:10)

On the 9 done (incl. Aletsch, Unteraar, Rhône, Pasterze, HEF): retreat ratio 0.77 (ens010)
/ 1.07 (ens118) vs elev bands 0.49 / 0.62 on the same glaciers, **but the calibration does
not fit today's state on the complex glaciers**: Aletsch 56 km² at the RGI date vs 82 (area
z −6), Unteraar / Rhône / Rotmoos too small (z −2 to −4), Forni / Pasterze collapse to one
particle (Neff 1), volume too high on several. 0 of 9 fit all 3 targets (elev bands 6–7 of 9).
So the better retreat partly comes from glaciers that are too small today: not a fair
comparison yet. Probably tributaries detaching / the prior centred on the elev-band static
calibration; not investigated.
- **Update on 15 of 18 glaciers (2026-11-04 ~02:15; Bossons, Oedenwinkel, U Grindelwald
  still running in 593361 / 593367 and will sync to `calib/` by themselves):**

  | | all 3 within σ | area within 2σ | retreat ratio | LIA terminus − outline | Δlength 1860–1920 / 1920–70 / 1970–2000 | ΣA_RGI-date (elev bands ~244) | LIA / RGI |
  |---|---|---|---|---|---|---|---|
  | elev bands ens010 (ref) | 60% | 93% | 0.58 | +43 m | −160 / −300 / −336 | 244 | 1.16 |
  | elev bands ens118 | 67% | 93% | 0.71 | +18 m | −372 / −396 / −402 | 246 | 1.20 |
  | centerlines ens010 | 7% | 53% | 0.84 | −83 m | −312 / −624 / −336 | 209 | 1.13 |
  | centerlines ens118 | 7% | 60% | 1.07 | −120 m | **−630 / −624** / −336 | 209 | 1.17 |

  Centerlines with ens118 reproduce the Leclercq timing (the only set-up so far to get
  the 1860–1920 retreat), but the calibration can't hold today's area (−15% in total,
  Aletsch −32%) and the LIA terminus is too low. A lead worth following (why do the
  complex glaciers fail to calibrate: tributaries, prior, λ2?), not a usable set-up yet.

### Overnight summary (2026-11-04)

1. Forcing: LIA area is linear in a pre-1850 offset (~+370 km² per 0.1 K, Alps-wide).
   LMR's own low-frequency uncertainty (20 MC runs) spans the observed LIA area (3 of 20
   above 4248): the "freak event" reading is plausible without changing the central
   reconstruction. ens118 −0.2 K matches the single-glacier outline area and LIA terminus
   with the round 7 geometry; ΔV LIA -> 2015 needs about that much too (175 vs 180).
2. Geometry: λ4 trades ~10% LIA area for the observed length / retreat; the no-rectangle
   fix is roughly neutral on the bigger sample; +20% inversion volume no help. Present-day
   fit of all geometry configs is close to a5v10 in physical units (volume −17% vs −11%).
3. Centerlines: right length timing, wrong present-day state (calibration fails on
   complex glaciers).
4. ELA: the model's LIA -> 1971–90 snowline rise is +79 m (ens010) to +149 m (ens118 −0.2 K).
5. The 1860–1920 retreat is reached only with a bigger state + λ4 or centerlines, and
   then 1920–70 overshoots. Any adopted forcing change needs AdaPBS rerun on it.

**Report (2026-11-04):** doc "OGGM geometry changes for the Alpine LIA",
https://claude.ai/artifact/QXLv5xCfrgbw7MNZGiSUQ4 (private until shared): diagnosis, the two
defaults (rectangular fallback, valley λ), options table with LIA effect / present-day cost
/ effort, trade-off chart (370-glacier sample, 5 geometries × 4 forcings vs the observed
point), recommendation (valley λ of its own; drop the rectangular fallback; choose glacier
λ with the forcing; one more centerline round).
