Findings — Track 1 v2.1 Phase 1: GLODAP real-observation hybrid fit (2026-05-11)¶
Phase 1 of the post-v2.0 follow-up. nb22 swaps Darwin's internal DIC + ALK targets for GLODAPv2.2016b mapped climatology DIC + ALK (real ship-CTD ocean observations, 1972–2013). The other 5 targets (FeT, Chl, POC, PIC, CO₂ flux) stay on Darwin output.
This is the cheapest possible test of "calibrating against reality vs. calibrating against Darwin's self-consistency" — it changes one variable (target source for DIC + ALK) and keeps everything else identical.
Note on scope: Phase 1 does NOT modify the box model itself. The 5-tracer / 2-PFT box stays unchanged. Phase 2 (5-PFT box extension) is what addresses the box-model bottleneck identified in v2.0. Phase 1 tells us what happens at the target boundary; Phase 2 will tell us what happens at the model boundary.
TL;DR¶
Swapping Darwin DIC + ALK targets for real-ocean (GLODAP) DIC + ALK substantially changes the recovered Carroll-6 vector. Most striking effects:
| Parameter | nb20 (Darwin) | nb22 (GLODAP) | Δ |
|---|---|---|---|
R_PICPOC |
360% off Carroll | 74% off | ✓✓ huge improvement |
scav_rat |
40% off Carroll | 92% off | ✗✗ doubles the gap |
alpfe |
1.1% off Carroll | 1.5% off | ~ slightly further |
diatomgraz |
89% off | 69% off | ✓ improved |
Smallgrow |
199% off | 191% off | ~ marginal |
Biggrow |
353% off | 356% off | ~ unchanged |
3 of 6 closer to Carroll, 2 of 6 further, 1 unchanged. The headline isn't "Phase 1 made things better" — it's "the recovered parameter vector depends substantially on whether you calibrate against the model or against reality."
Why this experiment¶
v2.0's headline result ("alpfe within 1.1% of Carroll") was achieved against Darwin output. Darwin itself was calibrated against partial real-world observations via Carroll 2020's Green's-functions. So:
| Target | What we're really doing | |
|---|---|---|
| Carroll 2020 | Real obs (DIC, ALK, …) | Calibrate Darwin against reality |
| nb20 (v2.0) | Darwin output | Calibrate DarwinDiff against Darwin |
| nb22 (v2.1 Phase 1) | Hybrid (DIC + ALK from GLODAP; rest from Darwin) | Calibrate DarwinDiff against partial reality |
v2.0 was implicitly "DarwinDiff replicates Green's-functions" — not "DarwinDiff calibrates against reality." Phase 1 flips one piece (DIC + ALK targets) and measures how the recovered Carroll-6 vector responds.
Setup¶
Identical to nb20 except:
- DIC target: GLODAP
TCO2interpolated to bin_average's 1° grid, µmol/kg → mmol/m³ at ρ_sw = 1025 kg/m³. - ALK target: GLODAP
TAlksame processing. - All other targets, covariates, network, training loop, AOI, hyperparameters: unchanged from nb20.
The grid alignment uses xarray.interp because GLODAP's half-integer cell centers don't match bin_average's integer centers. Bilinear interpolation, ~5% of edge cells dropped to NaN by the interp (handled by the ocean mask).
Results — DINN baseline (headline)¶
Per-tracer fit quality¶
| Tracer | nb20 (Darwin) | nb22 (hybrid) | Δ |
|---|---|---|---|
| FeT (Darwin) | −0.159 | +0.246 | ✓ improved (anti-correlated → positive) |
| Chl (Darwin) | 0.528 | 0.576 | ~ similar |
| POC (Darwin) | 0.595 | 0.641 | ✓ slightly improved |
| PIC (Darwin) | 0.622 | 0.491 | ✗ degraded |
| DIC (target source switched) | −0.229 | −0.437 | ✗ worse anti-correlation |
| ALK (target source switched) | −0.361 | −0.146 | ✓ less anti-correlated |
| CO2_flux (Darwin) | 0.451 | 0.477 | ~ similar |
The fit quality changes don't cleanly track "GLODAP is harder than Darwin" — some tracers improved, others got worse. The key finding: the optimizer landed in a different region of parameter space, and that region has a different spatial-pattern relationship with each tracer.
Carroll-6 recovery vs nb20¶
| Parameter | Carroll published | nb20 DINN | nb22 DINN | nb20 |Δ|/Carroll | nb22 |Δ|/Carroll | Closer? |
|---|---|---|---|---|---|---|
alpfe |
0.928 | 0.938 | 0.943 | 0.011 | 0.015 | ✗ slightly further |
scav_rat |
6.03×10⁻⁷ | 3.61×10⁻⁷ | 4.83×10⁻⁸ | 0.401 | 0.920 | ✗ much further |
Smallgrow |
0.661 | 1.976 | 1.923 | 1.989 | 1.910 | ✓ marginal |
Biggrow |
0.431 | 1.956 | 1.965 | 3.533 | 3.555 | ~ same |
diatomgraz |
0.830 | 0.089 | 0.260 | 0.893 | 0.686 | ✓ closer |
R_PICPOC |
0.0425 | 0.195 | 0.0111 | 3.598 | 0.738 | ✓✓ dramatic |
Results — DINNDeep (secondary)¶
DINNDeep saturates as expected, but at slightly lower r on the GLODAP targets:
| Tracer | nb20 DINNDeep r | nb22 DINNDeep r |
|---|---|---|
| FeT | 0.999 | 0.999 |
| Chl | 0.999 | 0.999 |
| POC | 0.996 | 0.993 |
| PIC | 0.995 | 0.986 |
| DIC | 0.985 | 0.942 |
| ALK | 0.986 | 0.963 |
| CO2_flux | 0.885 | 0.880 |
The drop on DIC (0.985 → 0.942) and ALK (0.986 → 0.963) is real signal: even DINNDeep's ~9.4K parameters can't memorize the real-ocean DIC + ALK fields as cleanly as Darwin's self-consistent versions. The 5-tracer box has limits the network can paper over for Darwin's output but not for the real ocean.
Three coupled phenomena explaining the result¶
-
R_PICPOCcollapses toward Carroll's value (360% off → 74%). GLODAP's real ALK distribution constrains the CaCO₃ budget (ALK changes via CaCO₃ formation at 2 mol per mol PIC). Darwin's internal ALK had been pulling R_PICPOC away from Carroll; real-world ALK pulls it back. This is the most striking single result of Phase 1. -
Iron pair degrades.
scav_ratfrom 40% off → 92% off Carroll. Interpretation: v2.0's iron-pair recovery was partly an artifact of Darwin's internal carbonate-iron coupling, which differs from the real ocean's. When the DIC + ALK targets switch to GLODAP, the carbonate-iron coupling in the loss landscape changes shape, and the optimizer no longer settles into Carroll-like iron-pair values. -
Field fit quality drops on the switched targets. DIC anti-correlation worsened (−0.229 → −0.437); even DINNDeep saturation level dropped on DIC + ALK. The real ocean's DIC + ALK has spatial structure (upwelling, riverine inputs, mode-water subduction) that our 5-tracer box cannot capture. The box-model proxy is more limiting against reality than against Darwin.
Implication for the v2.0 framing¶
The v2.0 paper text should be qualified:
DarwinDiff calibrates Darwin's iron pair to within 1.1% (← overclaimalpfe) and 40% (scav_rat) of Carroll's published values.✓ DarwinDiff calibrates Darwin's iron pair to within 1.1% (
alpfe) and 40% (scav_rat) of Carroll's published values when calibrated against Darwin output. Against real-ocean DIC + ALK observations (GLODAPv2.2016b), the recovered iron-pair values shift substantially (scav_ratto 92% off Carroll), whileR_PICPOCcollapses dramatically toward Carroll (360% → 74% off). The recovered parameter vector depends on whether the calibration target is the model's self-consistent BGC or the real ocean's measured fields. This is consistent with Darwin's BGC being a calibrated simplification of reality rather than a bit-for-bit reproduction.
What Phase 1 does NOT establish¶
- Whether nb22's recovered parameters are "better" than Carroll's — would need a forward Darwin run with nb22's parameter values + comparison to real ocean observations.
- Whether the box model can fit reality at all — Phase 1 swaps targets without extending the box. Phase 2 (5-PFT extension) tests this.
- Multi-basin generalization — Eq Pacific only.
Cluster paper next steps the result motivates¶
- Forward Darwin run with nb22's
scav_rat = 4.8×10⁻⁸(vs Carroll's 6.03×10⁻⁷ — an order of magnitude lower) → does Darwin produce better-fitting CO₂ flux fields with this value? 1-day forward Darwin run on cluster. - Phase 2: 5-PFT box extension → addresses the box-model proxy limitation. Expected to bring the 4 non-iron parameters into calibration-grade range regardless of target source.
- Multi-basin training with the 5-PFT box and real-obs targets → the strongest "DarwinDiff beats Green's-functions" claim possible without cluster compute.
Cross-references¶
- README — v2.0 status (will bump to v2.1 once Phase 2 lands)
- STATUS
- docs/findings/v2_track1_closeout.md — v2.0 detailed findings; Day 8 audit (Wanninkhof / K1K2); Day 9 audit (MITgcm CTRL + adjoint positioning)
- notebooks/22_glodap_dic_alk_hybrid.ipynb — this experiment
- src/darwindiff/glodap_loader.py — GLODAP loader module
- scripts/build_nb22.py — reproducible builder
- CONTRIBUTING.md — PR / commit / branch conventions used throughout v2.1