Explore the water column
Pick any date in the archive and any of the fifteen mandated depths, then click a point. One click returns the modelled profile, the values at every depth, and the 56-dimensional satellite embedding the network built for that pixel. Fields are reconstructed on demand and cached by date.
SIH 2026 · Team ZenTechs · PS 26066
Satellite surface fields to daily ocean temperature at 15 depths. Matched 2023–24 delayed-mode Argo evaluation: 0.6778 °C versus INCOIS 0.8554 °C, with lower RMSE at 14/14 shared depths.
Hover for the temperature under the cursor. Click for the full column. Red rings are delayed-mode Argo floats within ±3 days, click one to overlay the real measured profile.
Results panel
no point selectedClick anywhere on the map to fill this panel.
| Depth m | Temp °C | Argo °C |
|---|
awaiting a point
Drag to orbit, scroll to zoom, hover a slab to lift it, click to select that depth. Each slab is one of the fifteen mandated depths, tinted by the temperature at that level. Vertical placement is the real depth axis on a square-root scale, the same axis the profile chart uses. Solid block welds the slabs into one continuous section.
arrows orbit, page up and down pick, enter selectsEach of the 56 numbers is one dimension of the representation the network compressed the surface state into. A single linear readout turns this vector into the profile on the left. Hover any dimension for its index and activation.
Validation
Scored against held-out Argo observations. The deployed P1 ensemble uses earlier Argo observations for calibration; its inference inputs are surface fields only. The headline below is the repaired matched evaluation: 96 floats, 69 183 support-verified rows over 2023-24, identical rows per contrast, against the product PS 26066 actually names — the INCOIS operational Argo analysis.
Read these three numbers together, not separately
0.6778 against INCOIS. Lower RMSE than the Indian operational analysis at every one of the 14 shared depths, a 20.8 per cent margin, using satellite surface fields only. This is the claim the PS asks for and it is the strongest one we hold.
0.6885 against GLORYS12 converted into its own physical convention, versus their 0.7009 — 8 of 14 point wins but only 3 with simultaneous support. That is not a supported win and is not presented as one. The two contrasts sit on their own finite-row intersections, which is why our own figure differs between them.
We are not the best product in the basin. Armor3D and GLORYS2V4 are both ahead. The full ladder is below, printed here rather than buried.
Matched evaluation, per depth — 2023-24 delayed-mode Argo
96 floats, 69 183 support-verified rows. Both comparators scored on their own finite-row intersection with the same observation operator. Supported means the one-sided simultaneous lower bound over the predeclared 14-comparison family stays above zero, from 5 000 bootstrap resamples of whole floats rather than rows. Hairline marks wins under 0.005 °C — real, but not to be leaned on.
| Depth m | OceanVision | INCOIS | verdict | GLORYS12 in-situ | verdict |
|---|---|---|---|---|---|
| 5 | 0.3801 | 0.4988 | +0.1187 supported | 0.3787 | -0.0105 loss |
| 10 | 0.4687 | 0.5392 | +0.0706 point | 0.4572 | -0.0192 loss |
| 20 | 0.6731 | 0.6968 | +0.0237 point | 0.6193 | -0.0421 loss |
| 30 | 0.8038 | 0.8747 | +0.0709 point | 0.7701 | -0.0295 loss |
| 50 | 0.9132 | 1.2432 | +0.3301 supported | 0.9340 | +0.0017 hairline |
| 75 | 1.1277 | 1.6132 | +0.4855 supported | 1.1813 | +0.0557 point |
| 100 | 1.2366 | 1.6198 | +0.3832 supported | 1.3024 | +0.0801 supported |
| 125 | 1.0971 | 1.3933 | +0.2962 supported | 1.1638 | +0.0808 supported |
| 150 | 0.8960 | 1.1050 | +0.2091 supported | 0.9176 | +0.0263 point |
| 200 | 0.6325 | 0.7975 | +0.1651 supported | 0.6449 | -0.0129 loss |
| 300 | 0.3918 | 0.5569 | +0.1651 supported | 0.4779 | -0.0016 loss |
| 500 | 0.3147 | 0.4184 | +0.1037 supported | 0.3310 | +0.0010 hairline |
| 700 | 0.2890 | 0.3514 | +0.0624 supported | 0.3335 | +0.0199 supported |
| 1000 | 0.2653 | 0.2679 | +0.0026 hairline | 0.3014 | +0.0244 point |
| mean14 | 0.6778 | 0.8554 | 14/14 · 10 supported | 0.7009 | 8/14 · 3 supported |
mean14 is the mean of the fourteen per-depth RMSEs, not the square root of a pooled MSE. They are different statistics and only the first is the quantity PS 26066 item 7 describes. Our widest margin is 0.486 °C at 75 m, in the thermocline; our narrowest is at 1000 m, where the win is +0.0026 °C and carries no support.
The surface-only question, answered with a rival rather than an empty table
Calling ourselves the best surface-only method while being the only surface-only entry is a race with one runner. So OSnet (Pauthenet et al. 2022) — an ensemble of per-point MLPs mapping a surface snapshot plus position and season to a whole profile — was reimplemented, retrained for the North Indian Ocean on our own fit-era Argo, and scored on our own 69 183 rows through the same scorer.
| Arm | Information it receives | mean14 | We lead by | Verdict |
|---|---|---|---|---|
| OSnet-pub | SST + SLA, one snapshot, + position/season — their published set | 0.9928 | +0.3043 | 14/14 · 13 supported |
| OSnet-full | all 8 surface fields at 5 lags — our information, their architecture | 0.7421 | +0.0536 | 13/14 · 13 supported |
| OceanVision | all 8 fields, 26-day history, spatial U-Net ensemble | 0.6885 | - | - |
The two arms split the deficit cleanly. Of OSnet's 0.3043 °C, 0.2507 is information — two fields and one snapshot instead of eight fields and a history — and the remaining 0.0536 is architecture, a per-point mapper against a spatial network that can see the front or eddy a pixel belongs to. Handed identical information the architecture still loses at 13 of 14 depths, and every one of those 13 carries simultaneous support — better-supported than our INCOIS headline (13/14 against 10/14).
Two honest caveats. This is an OSnet-style reimplementation, not the published weights, which were fitted for the North Atlantic. And one rival is not a field: PGTransNet, DSVIT and the Wang ESSD architectures remain unbenchmarked here.
Skill by depth, historical Jul-Dec 2025
PS 26066 item 7 asks for correlation, RMSE and bias. All three are here, on the 4 882 delayed-mode Argo matchups of the sealed window, with GLORYS12 scored on identical rows. This is a separate, earlier run from the repaired 2023-24 evaluation above. The window was sealed at that earlier model stage; these scores predate the final observation-support and temperature-convention corrections. They are historical evidence, not a fresh confirmation of the final repaired model.
Depth runs downward on a square-root scale, the way an oceanographic profile is always drawn. Hover any depth for both numbers and the margin.
Every metric, every depth
| Depth m | RMSE ours | RMSE GLORYS | Bias ours | Bias GLORYS | Corr ours | Corr GLORYS | ACC ours | ACC GLORYS | n |
|---|
Bias is the column to read twice. Through the thermocline GLORYS12 runs warm by +0.52 °C at 75 m and +0.72 °C at 100 m, while ours is +0.11 and +0.26, roughly five times smaller. A reanalysis that assimilates Argo still carries a systematic warm offset exactly where the water column turns over; reconstructing from the surface does not inherit it.
Anomaly correlation removes the seasonal climatology first, so it measures skill at the departures rather than at the calendar. It is the harder and more honest of the two correlations, which is why both are shown.
Every reachable baseline, 2023-24, identical rows
| Product | RMSE °C | Sees subsurface data? |
|---|---|---|
| Armor3D | 0.3913 | yes, interpolates Argo directly |
| GLORYS2V4 | 0.5871 | yes |
| GLORYS12 | 0.6582 | yes |
| OceanVision | 0.6603 | no, satellite only |
| C-GLORS | 0.6915 | yes |
| HYCOM GOFS 3.1 | 0.7957 | yes, separate 167-day sample |
| ORAS5 | 0.8083 | yes |
| Climatology | 1.0095 | - |
This table exists to reach the reanalyses that GREP only publishes through 2024. On it we sit level with GLORYS12: 0.6603 against 0.6582, a gap of 0.0021 °C, which is 0.3 per cent and not a real difference. Only Armor3D and GLORYS2V4 are meaningfully ahead, and both are fed the very Argo profiles they are then scored against. OceanVision reconstructs from surface inputs at inference; earlier Argo observations participated in P1 calibration.
Armor3D beats us by 0.27 °C and GLORYS2V4 by 0.07 °C. Any presentation of this work that implies we lead the basin is wrong, and this table is printed on the validation page rather than in an appendix for that reason. The defensible statement is narrower and still worth making: OceanVision is the only product here that does not require contemporaneous subsurface observations at inference, and its historical point estimates outperform four of the six that do. The remaining gap to GLORYS2V4 is concentrated almost entirely in the 50-150 m thermocline — their 0.9572 at 75 m against our 1.0824 — which is exactly where a surface-only method has least to work with.
These figures predate the September pipeline repair
They use 10 091 rows against the repaired table's 69 183, and were computed before the observation-support, climatology-isolation and temperature- convention fixes. This historical ranking has not been rerun on the repaired pipeline; its absolute values are not directly comparable with the numbers at the top of this page. Re-running the ladder on the repaired pipeline is outstanding work, and it is listed as outstanding rather than quietly omitted.
On the historical 2025 protocol we scored below GLORYS12, 0.5547 against 0.5927, a 6.4 per cent margin at 12 of 15 depths, on a window that was frozen at that earlier stage. This does not establish future all-depth superiority.
R², three values, three different questions
| Value | Who predicts | Predicts what | Reference |
|---|---|---|---|
| 0.9876 | full ensemble | absolute temperature | GLORYS12 0.9871 |
| 0.5608 | full ensemble | the anomaly | GLORYS12 0.5419 |
| 0.4749 | a straight line, network frozen | anomaly, from 56 numbers | PCA control 0.4272 |
Climatology alone, predicting the seasonal average and nothing else, scores R² 0.9700 on the same 80 699 matchups. An R² near 0.98 is the starting line in this field, not a finish line.
The probe figure was previously reported as 0.4121 against a 0.3216 PCA control. Both were quoted from a docstring rather than measured. Measured properly — ridge readout, held-out eastern longitude band, PCA control at equal width — the embedding scores +0.4749 against +0.4272. The conclusion survives; the margin is half what was asserted.
The PS contract, verified rather than declared
Five items, each checked against the data. The status line reads a predeclared list, so an item that silently fails to compute reads INCOMPLETE rather than quietly disappearing — which is exactly what the INCOIS comparison did until it was caught.
| Item | Verified by | Measured | State |
|---|---|---|---|
| Domain & grid | worst-cell step uniformity, four declared bounds | 5-30°N, 45-105°E, 101×241, 15 depths | pass |
| Validity mask | every level loses cells to bathymetry, deepest more than surface | 0.4821 wet at 0 m → 0.3669 at 1000 m | pass |
| Embedding engine | grid match, per-channel variance, probe actually ran | R² +0.4749 vs +0.4272 PCA | pass |
| INCOIS agreement | 14 depths covered, three statistics finite, zero time offset | RMSE 0.9-0.95 · bias +0.11 · r 0.80 | pass |
| Training lineage (P0) | gradient, argmin, stop horizon, checkpoint sha256 | GLORYS val 0.6262 · independent Argo monitor 0.7271 · stop_metric=glorys | pass |
P0 is the PS's own supervision path — GLORYS12 only, with Argo touching neither the gradient, nor the argmin, nor the early-stop horizon — reported separately from the shipped Argo-calibrated P1. P0's 0.7271 °C Argo monitor and 0.6262 °C GLORYS validation use different targets and are not a paired comparison. The field-to-field INCOIS figure is given as a range because it carries 0.032 °C of date-sampling sensitivity; quoting it to four decimals would overstate its precision.
Five evidence gates, all passing
G3 was the last to fall, and neither axis was closed by finding better metadata — the missing metadata was the problem. GLORYS ships potential temperature with no salinity, so the conversion was performed with WOA23 salinity (all 15 depths exact, TEOS-10 throughout) and the residual from using a climatology rather than the matched field bounded at 0.0008 °C. INCOIS ships no CF time bounds, so the window was determined by asking which candidate window best explains the product's own Argo inputs: t-8 to t+2, separation 9.8× sem, permutation p = 0.005. The assumed centre was wrong. Neither result claims metadata that does not exist.
Corrections that changed a number
Every item here was found by measuring something previously assumed. Several were errors in earlier reporting of this same work, including on earlier versions of this page.
- The GLORYS comparison mixed two temperature conventions. In-situ output was differenced against potential temperature; t - θ reaches +0.108 °C at 1000 m. Corrected: 6/14 · 2/14 → 8/14 · 3/14. This correction helps us, which is why it is listed rather than absorbed.
- "Removing the climatology leakage is essentially free." Withdrawn. The label cache was keyed without the climatology, so both arms trained on identical labels. The broken run reported +1.37 %, within 0.06 pp of the true +1.43 %, by pure noise — the tell was seed 1 disagreeing in sign. Repaired seeds agree to 0.007 pp.
- A compliance report quoted an R² from a docstring. Measured: +0.4749 against +0.4272 for a PCA control at equal width. The conclusion holds, the margin is half what was asserted.
- The evaluated model was not the locked model. A scorer had a CNN override but no blend override, so a locked weight file sat unread while production weights were used. Locked and production differ by up to 0.23 °C.
- Unsupported interpolation invented labels. One float with levels at 6.8 and 838.2 dbar was interpolated to yield a 125 m "observation". 16 of 278 rows carried 97 % of the squared error at 500 m.
- A required contract item could not fail. The status line scanned only items that existed, so an item that never computed was invisible. Requirements are now predeclared.
Limits, stated plainly
- Two products beat us and one of them, Armor3D, does so decisively.
- Simultaneous support stops at 10 of 14 depths against INCOIS and 3 of 14 against GLORYS12. The binding constraint is the 96-float sample forcing a ~2.6 critical value, not model quality.
- Two of the eight GLORYS wins are hairline (+0.0017 and +0.0010 °C), as is 1000 m against INCOIS (+0.0026 °C).
- The surface-only field has two members, not many. The OSnet arms are reimplementations, not published weights.
- Six subsurface products is what is reachable, not what exists. The CMEMS reanalysis ensemble carries exactly three members and all three are scored. EN4, ISAS, Ishii and IAP are monthly, so collocating them against daily Argo would compare a different quantity — absent by judgement, not oversight.
- No fresh cohort exists. Every window used here has been inspected at least once, so none can be called sealed again.
- 0 m has no independent validation. The archived INCOIS product starts at 5 m and Argo almost never samples 0 m, so the surface level is emitted from the model head and reported separately — never copied from the SST input.
How it works
Seven satellite fields in, a full three-dimensional temperature field out. No subsurface observation is required at inference.
Harmonise the surface
Seven products on different grids and cadences are forced onto one 0.25° daily grid, 101 × 241 cells covering 5-30°N, 45-105°E.
Learn a representation
The network compresses each surface patch into 56 numbers, verified by linear probe to carry more subsurface signal than an equal-width PCA representation.
Reconstruct the column
Four model families predict all fifteen depths, blended with per-depth weights. 26 days of surface history, 246 input channels.
Validate independently
Scored against delayed-mode Argo floats never seen in training, with the reanalysis scored on identical rows.
The seven inputs are fields, not form values
Each input is a full 101 × 241 map of the basin, and the model consumes 26 consecutive days of them, roughly 11 700 ocean cells × 7 variables × 26 days for a single output. That is why this interface asks for a date rather than seven numbers: the date selects which satellite maps to load.
| Field | Product | Provider |
|---|---|---|
| Sea-surface temperature | MUR25 L4; OISST v2.1 pre-2003 | NASA PODAAC / NOAA |
| Sea-surface salinity | SMAP RSS V6, 8-day | NASA PODAAC |
| Sea-level anomaly | DUACS L4 multiyear | Copernicus Marine |
| Currents U, V | OSCAR v2.0 FINAL | NASA PODAAC |
| Winds U, V | CCMP V3.1 daily | NASA PODAAC |
| Training target | GLORYS12, 1/12° to 3×3 mean to 0.25° | Copernicus Marine |
| Validation | Coriolis Argo, QC ≤ 2, delayed-mode | Coriolis / Ifremer |
What the ensemble is made of
| Member | Architecture | Parameters |
|---|
Which dates work, and why
Any date in the archive. The range shown in the sidebar is not a model limit, it is simply how far the satellite archive has been downloaded. The model is diagnostic: it maps observed surface fields to the subsurface, so it needs the target day plus roughly six months of preceding surface history.
Reaching today is a download job, not a retrain. Extending to the present is bounded only by each satellite product's own latency, typically two to seven days behind real time, so an operational deployment would serve up to about today minus five days on a daily cron.
Future dates cannot be reconstructed, because tomorrow's satellite observations do not exist yet. The model does, however, accept forecast surface fields exactly as it accepts observed ones. Feeding it an ocean or atmospheric forecast turns the same network into a subsurface forecast system without retraining. That is the natural extension, and it is honest to say it has not been evaluated here.
Why the first click on a new date is slow
Asking for a date the server has not seen makes it load 26 days of satellite fields and run every ensemble member over the full 101 × 241 grid, of which 11 736 cells are ocean. On the small cloud CPU instance behind this demo that takes about 30 seconds. Every depth, point and embedding on that same date afterwards comes back in roughly one second, because the whole 15 × 101 × 241 field is already resident in memory.
The same field takes 1.0 s on an L40S GPU and 4.2 s on a four-thread CPU. The demo box is small on purpose: two cores, 3.8 GB, and the entire hosting bill is 37 dollars a month.
This demo serves the seed-mean model, the same one the Validation page reports. Its CNN member is the mean of five independently seeded replicates' predictions — not their weights, which would be meaningless, since independently initialised networks land in different loss basins and their parameters are not interchangeable. That makes the bundle 676 MB (211 MB of blend members plus 465 MB of seed checkpoints) and about 1.7 GB resident. Serving the single shipped network instead would score 0.6838 against INCOIS with 9 supported depths, rather than the published 0.6778 with 10.
Running five networks instead of one costs almost nothing here, because the gradient-boosted member dominates the runtime: the measured cold field is 35 s either way. The 56-number embedding on the Explore page still comes from the single shipped network, because there is no meaningful mean of five seeds' internal activations — channel k means a different thing in each basin. That is also the network the probe R² was measured on, so every number this site reports belongs to the network that produced it.
Ocean hazard indicators
A reconstructed temperature profile is not only an answer to PS 26066. It is the input that four operational hazard indicators need and currently cannot get daily at 0.25° without a float in the water. This page is the extension we are building.
Why these follow from the model rather than needing a new one
Each indicator below is a functional of the vertical temperature profile — an integral, a threshold crossing, or a percentile exceedance. The model already emits that profile on every ocean cell, every day, at fifteen depths. So the extension needs no new architecture, no new training data, and no new observation: it needs the profile, a defensible threshold, and honest error propagation.
That is also the whole risk. An indicator built on a profile is never more accurate than the profile, and integrals can hide compensating errors while thresholds amplify small ones. Each card states which of the two it is.
Cyclone intensification potential
The operational quantity is Tropical Cyclone Heat Potential: the heat stored above the 26 °C isotherm, which is the reservoir a cyclone actually draws on as it mixes the column. Depth of that isotherm is D26.
Threshold indicator — small profile errors move the isotherm and are amplified, not averaged out.
Subsurface marine heatwaves
A marine heatwave is a discrete exceedance of the seasonally varying 90th percentile for five or more consecutive days. Applied at the surface it is routine. Applied at depth it is a research frontier, because the daily subsurface fields to compute it over have not existed at this resolution.
Percentile indicator — needs the baseline and the reconstruction to share a bias, or the exceedance count is wrong in a fixed direction.
Upper-ocean heat content drift
Integrated heat anomaly over the top 1000 m, on the model's own depth grid with trapezoidal weights over unequal spacing. The constant-density form is a diagnostic comparison, not exact thermodynamic heat content.
Integral indicator — opposite-signed depth errors cancel, so a good OHC does not imply a good per-depth profile. Reporting it alone would flatter the model.
Barrier layer — blocked, and why
Bay of Bengal river discharge puts fresh water over warm water, so the density mixed layer can sit well above the isothermal layer. That barrier suppresses the cyclone-induced cooling that would otherwise limit intensification.
Requires a joint T/S model. That is a scoped extension, not a parameter change, and it is the single largest piece of new work on this page.
The error budget that gates all of this
TCHP is the indicator with real operational value, and it is the one our current error most threatens. Its integrand lives in the 50-150 m thermocline, which is precisely our worst band: RMSE 1.13 °C at 75 m and 1.24 °C at 100 m.
Propagating that honestly: with ρ0cp ≈ 4.09 × 106 J m-3 K-1, a 1 °C mean error through an 80 m layer is worth ≈ 33 kJ/cm² of TCHP. The rapid-intensification threshold people actually use is around 50 kJ/cm². An error two-thirds the size of the decision threshold is not an operational product, and no amount of interface polish changes that.
So the gate is explicit. Thermocline RMSE has to come down before TCHP ships as anything but a research diagnostic. That is the same 50-150 m band that is our gap to GLORYS2V4 on the validation page — one improvement, two payoffs. It is the reason the thermocline is the top of the roadmap rather than a footnote in it.
What has to be true before any of this is claimed
- A predeclared threshold with a citation for each indicator, plus a sensitivity report — threshold definitions vary across the literature and picking one after seeing results is not a method.
- Validation against float-derived indicators, not against another model's indicator field. Comparing our TCHP to a reanalysis TCHP measures agreement, not skill.
- Error propagation through the functional, reported as an indicator-space uncertainty rather than a temperature RMSE the user then has to convert.
- Thermocline RMSE below the budget above for TCHP specifically.
- A joint temperature/salinity model before the barrier layer is attempted at all.
Until those hold, this page is a statement of direction with the physics written down and the blocking numbers in plain sight — not a feature.
The reconstruction is the product. Everything above is downstream of the profile on the Explore page, and the validated work is on the Validation page.
Research & resources
The full technical paper: the inverse problem, the observation operator, the training objective, the algorithm, the inference protocol and the limits. Every equation is the one the code implements, and the constants are the ones it uses.
We reconstruct daily temperature at the fifteen standard depths from 0 to 1000 m across 5-30°N, 45-105°E on a 0.25° grid, using only satellite-observed surface fields at inference: sea-surface temperature, sea-surface salinity, sea-level anomaly, surface currents and 10 m winds. A spatial encoder-decoder consumes a 26-day causal history of eight surface fields plus a validity mask, together with static climatological, coordinate, calendar and bathymetric channels, and emits all fifteen depths at once. Training combines a sparse Argo objective aligned to the reported metric with a dense area-weighted reanalysis objective. Evaluation is paired: every contrast is scored on identical rows through a single vertical observation operator, with simultaneous one-sided bounds from whole-float bootstrap resampling over a predeclared comparison family. On 96 delayed-mode floats and 69 183 support-verified rows over 2023-24, the reconstruction has lower RMSE than the INCOIS operational Argo analysis at all fourteen shared depths (0.6778 against 0.8554 °C, ten with simultaneous support), and beats a retrained OSnet-style per-point network given identical inputs at thirteen of fourteen depths, all thirteen supported. It does not outperform Armor3D or GLORYS2V4, both of which assimilate the subsurface observations they are then scored against. The residual error is concentrated in the 50-150 m thermocline.
1The inverse problem and what makes it hard
Let horizontal position be x = (λ, φ), longitude and latitude, and let d ≥ 0 be depth in metres, positive downward. The mandated output depths are
The task is to estimate T(x, t, d) for every d ∈ D from surface information alone. Write the causal encoder-decoder as
The history is strictly causal: no field dated after the issue time enters ht. The encoder output ht is the embedding-engine artifact the problem statement asks for, and is exported with its shape, stride, temporal support and weights.
Under squared error the optimal predictor is the conditional mean, and the error decomposes exactly:
This is an identity, not an estimate of either term. It is worth stating because it names the obstacle precisely: different subsurface states can share almost identical surface expressions. Two columns with the same SST, SSS, sea level and surface currents can differ by more than a degree at 100 m. The first term is what no surface-only method can remove; the second is the only one modelling effort can touch. We make no claim to have measured the split for this basin — a failed displacement regressor is not a measurement of an irreducible floor.
2Data and permitted information
Seven time-varying surface fields are harmonised onto one 0.25° daily grid of 101 × 241 cells, of which 11 736 are ocean.
| Field | Product | Provider | Role |
|---|---|---|---|
| Sea-surface temperature | MUR25 L4; OISST v2.1 pre-2003 | NASA PODAAC / NOAA | input |
| Sea-surface salinity | SMAP RSS V6, 8-day | NASA PODAAC | input |
| Sea-level anomaly | DUACS L4 multiyear | Copernicus Marine | input |
| Surface currents U, V | OSCAR v2.0 FINAL | NASA PODAAC | input |
| 10 m winds U, V | CCMP V3.1 daily | NASA PODAAC | input |
| Bathymetry | GEBCO, regridded | GEBCO | static prior |
| Dense training target | GLORYS12, 1/12° → 3×3 mean → 0.25° | Copernicus Marine | label |
| Sparse label & validation | Coriolis Argo, QC ≤ 2, delayed-mode | Coriolis / Ifremer | label / truth |
The input tensor for one day carries 246 channels, composed exactly as:
- 234 temporal channels = 26 daily frames × 9 fields. Each frame holds the seven surface fields, a derived wind-curl channel, and the land/ocean mask, which is always last within a frame and never scaled.
- 12 static channels = 7 surface-climatology fields (one per input variable) + 2 normalised coordinate planes + 2 day-of-year channels (sin 2π·doy/365.25, cos 2π·doy/365.25) + 1 bathymetry plane.
The climatology is fit-only, 1993-2020. Any climatology estimated over a window that includes evaluation years leaks the answer, and this one does not. Enforcing it costs 1.43 % of skill, measured against a repaired control rather than assumed, and that cost is paid rather than avoided.
At inference no subsurface observation of any kind is read. Bathymetry is a static external prior and is disclosed as one. A surface field dated today but released days later cannot support a same-day operational claim, so the practical operating point is roughly today minus five days, set by each satellite product's own latency.
3The observation operator and its physics
3.1 From what a float measures to what the model predicts
A float reports adjusted pressure p, in-situ temperature t, and practical salinity SP. None of those is metres, and none is the model's quantity. Using TEOS-10 throughout:
GSW takes pressure in dbar and position in degrees. Those unit boundaries are recorded explicitly because crossing one silently is the classic way this calculation goes wrong.
3.2 Two temperature conventions cannot be differenced
The model is fitted to in-situ ITS-90 Argo temperature. GLORYS12 ships potential temperature θ. Differencing one against the other is a units error wearing the same name, and it is not repaired by calling both arrays "temperature". The comparator is converted with the full chain:
Measured over our rows, t − θ reaches +0.108 °C at 1000 m (maximum 0.1379), which is comparable to the margins being argued about at depth. Section 4.1 of our protocol forbids borrowing the held-out Argo salinity to improve a comparator's conversion, so WOA23 monthly climatological salinity is used, present at all fifteen depths exactly with no vertical interpolation. The residual from using a climatological rather than the matched salinity field is bounded by redoing the conversion at S ± 0.5 psu: 0.0008 °C, two orders below the margins in question.
This conversion makes GLORYS worse (0.6941 → 0.7009), so it favours us and is held to a higher standard for that reason. It is performed because the physics requires it, and it would be required if it went the other way.
3.3 Interpolation support, and refusing to invent a label
Let Ii(dk) be linear interpolation between the two valid native levels bracketing dk. The observation validity indicator mobsik is set to zero when the target has no bracket, fails QC, crosses an excessive gap, or lies below the seabed. No endpoint extrapolation is permitted, and the bracket limits are the INCOIS manual's own: <50 m spacing above 100 m depth, <100 m below.
This is not a technicality. One float with valid levels at 6.8 and 838.2 dbar was previously interpolated to produce a 125 m "observation" — a number with no measurement behind it. Sixteen such rows out of 278 carried 97 % of the squared error at 500 m. A method evaluated against invented labels is measuring its agreement with a straight line.
For a pairwise comparison against product c the mask is mik = mobsik fOVik fcik, the product of observation validity and both products having a finite prediction there. The operator is held fixed between training variants and every benchmark candidate. Because each comparator has its own finite-row intersection, our own mean14 differs between contrasts — 0.6778 against INCOIS, 0.6885 against GLORYS12 — and that is a property of the row sets, not of two different models.
Observation, representation and model error all contribute to e. The common practice of subtracting an assumed observation-error variance to manufacture a "true model RMSE" requires zero covariance between the terms, which assimilating products violate by construction. We do not do it.
4The metric, and optimising the thing being judged
For the fourteen subsurface depths:
This is the mean of per-depth RMSEs, not the square root of a pooled MSE. They are different statistics and only the first is the quantity the problem statement describes. Pooled RMSE is dominated by whichever depths happen to be best sampled; thickness-weighted error answers a third question again. All three are kept distinct and only J14 is reported as the headline. Bias is \(b_k = \sum_i m_{ik} e_{ik} / n_k\); correlation is Pearson over the same pairs, computed depth by depth, because a correlation pooled across depths is dominated by the mean vertical gradient and is a weak diagnostic.
With s0 = 1 °C a fixed unit scale, the dimensionless sparse objective mirrors the metric rather than approximating it:
with ε = 10−4 a numerical stabiliser. Batches are sampled so deep levels appear regularly. Validation sufficient statistics are averaged over the full validation set before the square root is taken — averaging per-batch RMSE is a different statistic and a slightly optimistic one.
For dense GLORYS labels G, with wet masks qjk and cell areas Aj ∝ cos φj:
Area weighting is correct for a grid objective and must not silently replace the declared float-sampled evaluation metric. The land mask is applied before any reduction. The full-data gradient of the reported metric for a valid row is
The 1/(nkRk) factor is the whole point: a pooled-MSE loss weights a row by nothing, whereas the reported metric weights it inversely by how well-sampled and how well-predicted its depth already is. Sparsely sampled deep levels therefore carry more gradient per row, which is what the metric asks for.
Objective conflict is monitored rather than assumed away, via the cosine between the two gradients on the shared encoder:
Repeated negative c indicates local disagreement between the two supervisions, not proof that the reanalysis is globally harmful.
5Architecture
The primary member is a 2-D encoder-decoder over the basin, treating the 246 channels as feature depth and the grid as spatial extent. It is spatial by design: a per-point mapper cannot see that a pixel sits on the warm flank of an eddy, and section 10 measures exactly what that costs.
| Property | Value | Note |
|---|---|---|
| Input | 246 × 101 × 241 | 26 frames × 9 fields + 12 static |
| Output | 15 × 101 × 241 | all depths in one forward pass |
| Encoder depth | 4 | down/up stages |
| Base width | 56 | this is the exported embedding width |
| Dropout | 0.2 | overfitting-limited regime |
| Optimiser | AdamW, lr 6×10-4, wd 3×10-4 | 20 % warmup |
| Batch | 16 days | whole fields, not point samples |
| Training VRAM | 4 124 MiB | measured peak, not reserved |
Emitting all fifteen depths from one head lets the network share vertical structure across levels rather than solving fifteen unrelated regressions. The embedding ht is the 56-channel activation immediately before the final 1×1 convolution — the representation a single linear readout turns into T(z).
That the embedding carries subsurface information beyond its own inputs is a measurement, not a design claim: a ridge readout on a held-out eastern longitude band scores R² +0.4749 from the 56 numbers against +0.4272 for a PCA control at equal width. An earlier version of this work quoted 0.4121 against 0.3216 from a docstring rather than a measurement; the conclusion survived, the margin halved.
6The algorithm
6.1 Training
Two properties of that loop are load-bearing. First, stop_metric is an
explicit argument, so the P0 lineage — the problem statement's own supervision
path — can be run with Argo touching neither the gradient, nor the argmin, nor the
early-stop horizon. A run declaring --argo-weight 0 while still stopping
on Argo is refused by a guard, because the exposure is otherwise invisible: it amounts
to two epochs of selection signal, which is small but is not zero and must not be
reported as zero. Second, the climatology used to build C is fit-only
by construction, not by convention.
6.2 Inference
The curl line carries a real bug that was found and fixed. The helper that builds an inference window subtracted the climatology before assembling frames, so it computed the curl of the wind anomaly, while the dataset that trained the model used absolute wind. The difference is curl(uclim): 0.2 % at the median but 34 % at the peak. Production reaches the network through the dataset path so the headline is unaffected, but two other entry points used the helper and were silently feeding the model a channel it was never trained on. A parity test between the two paths now runs in CI.
7Ensemble and blending
Per-depth nonnegative weights are fitted on a dedicated blend year, with shrinkage toward a prior w0k:
A member trained on the blend year's labels is ineligible for this procedure. With Σk the covariance of member errors and bk their bias vector,
which is why an individually weaker but decorrelated member can help while twenty correlated ones do not. The unconstrained minimum-variance solution Σ−11/(1TΣ−11) is diagnostic only; the constrained regularised fit above is what ships.
Seed averaging is of predictions, never of weights
Averaging the predictions of independently seeded replicates is one of the largest cheap gains available here. Averaging their parameters is not the same operation and is not valid: independently initialised networks converge into different loss basins, and their weights are not interchangeable coordinates. A parameter-space mean of two good models is generally not a model. Any deployment of the seed ensemble must therefore carry all members and mean their outputs.
8Dynamical features derived from the permitted inputs
Deriving features from the seven inputs preserves their information source; reading a new observed field at inference would change the task. Two families are used, and both are stated precisely because both are easy to get subtly wrong.
8.1 Wind forcing
Wind-velocity curl and wind-stress curl are different quantities with different units, and conflating them is common. With a documented bulk drag law,
Stress is in N/m². For eastward/northward components (Aλ, Aφ) the radial curl on a sphere is
With f = 2Ω sin φ, the large-scale Ekman pumping diagnostic, positive upward, is
Keeping f inside the derivative is not optional. Pulling it out discards its latitude dependence, which over a 25° meridional span is a large error. The domain starts at 5°N so f = 0 is avoided, but the low-latitude edge still needs one-sided or masked stencils, and invalid stencils are excluded rather than filled.
8.2 Sea level and currents
A current product derived from the same altimetry as η is not independent information, though its representation can still help learning. Vorticity \(\zeta = \partial_x v_s - \partial_y u_s\), divergence, and front magnitude \(\lvert\nabla \mathrm{SST}\rvert\) are computed on physical grid distances. These describe fronts, rotation and forcing; they do not uniquely determine the water column, which is equation (2) restated in physical terms.
Sea surface height contains steric, mass-loading and reference-depth contributions, so a temperature-only integral cannot be forced to equal observed SSH. No constraint of that kind is imposed.
8.3 Stratification, and why a monotonicity prior would be wrong here
In the Bay of Bengal, river discharge creates a fresh surface layer that can sit above warmer water, producing genuine temperature inversions beneath a shallow density mixed layer. A global rule forcing temperature to decrease with depth would be unphysical in exactly the region the problem statement cares most about. None is imposed. Where salinity is available the local buoyancy frequency is
and differentiating in-situ density with depth — thereby reading compressibility as stratification — is a known trap that is avoided. Without credible subsurface salinity labels any stability penalty is disabled: surface salinity alone cannot certify a density profile.
8.4 Vertical derivatives on an unequally spaced grid
The fifteen levels are not equally spaced — 5 m near the surface, 300 m at depth — so a uniform stencil is wrong by a factor of sixty across the column. With Δdk = dk+1 − dk:
A linear profile must return exactly zero discrete curvature at interior levels; this is a unit test, not an assumption.
8.5 Why the thermocline is the hard band
A downward displacement ξ > 0 of a background profile has the first-order effect
Where |∂dB| is large, a modest depth error becomes a large temperature error: a 10 m displacement across a 0.1 °C/m gradient is about 1 °C. That is the entire explanation for the shape of our error curve, for the shape of every comparator's error curve, and for why the gap to GLORYS2V4 sits almost entirely between 50 and 150 m. The approximation fails for large shifts or changing profile shape.
9Evaluation protocol
Five gates must pass before any number is reportable. They are adversarial by construction: each was written to make a specific way of fooling ourselves impossible, and each was verified to still reject on its failure modes after being made evidence-aware.
9.1 Simultaneous inference over a predeclared family
Fourteen depths × several comparators is a multiple-comparison problem. A per-depth 95 % interval repeated fourteen times is not a 95 % statement about the set. Define δ̂j = Rjc − RjOV over the predeclared family j, resample whole WMO floats with replacement retaining all their cycles and depths, and form
A win is claimed only where ℓj > 0. Floats are the resampling unit because profiles from one float are strongly dependent — treating rows as independent would inflate the sample by roughly the number of cycles per float and manufacture significance. This is an approximate simultaneous one-sided basic/pivotal construction, distinct from a percentile interval; for a single comparison it reduces to \(2\widehat{\delta} - Q_{.95}(\widehat{\delta}^{*})\). 5 000 resamples, seed 26066, one shared resample across the whole family.
9.2 Determining the comparator's analysis window without circularity
The INCOIS product ships no CF time bounds, so its timestamp convention was unknown and had been assumed. Tuning the offset against our own error would be circular — it would select whatever window flatters us. Instead the window was determined from the product's own Argo inputs: for each candidate offset, measure the misfit between the analysis field and the profiles collected in that window. The answer is then a property of the product.
Over offsets (−12 … +2) the minimum is at −8, i.e. a window of t−8 to t+2. Two controls: a permutation test pairing each field with another cycle's profiles gives p = 0.005, and the curve is resolved at 9.8× the standard error of the mean. The assumed centre was wrong. Residual exposure from the window choice is 0.0395 °C.
10Results
96 delayed-mode floats, 69 183 support-verified rows, 2023-24, identical rows per contrast.
| Contrast | OceanVision | Them | Point wins | Simultaneous |
|---|---|---|---|---|
| INCOIS operational analysis | 0.6778 | 0.8554 | 14 / 14 | 10 / 14 |
| GLORYS12, converted to in-situ | 0.6885 | 0.7009 | 8 / 14 | 3 / 14 |
| OSnet-full (our inputs, their architecture) | 0.6885 | 0.7421 | 13 / 14 | 13 / 14 |
| OSnet-pub (SST + SLA, one snapshot) | 0.6885 | 0.9928 | 14 / 14 | 13 / 14 |
| Monthly climatology | 0.6778 | 1.0690 | 14 / 14 | 13 / 14 |
| Armor3D ahead of us | 0.6603 | 0.3913 | — | — |
| GLORYS2V4 ahead of us | 0.6603 | 0.5871 | — | — |
The last two rows are from the external ladder on 10 091 pre-repair rows and are not directly comparable in absolute value with the rows above; the ranking is what they establish.
10.1 Decomposing the surface-only comparison
Running OSnet twice separates two claims that are usually conflated. Of its 0.3043 °C deficit under its published inputs, 0.2507 is information — two fields and one snapshot versus eight fields and a 26-day history — and the remaining 0.0536 is architecture. Handed identical information, the per-point mapper still loses at 13 of 14 depths with all thirteen supported, which is better-supported than our headline INCOIS result. That is the cleanest evidence in this work that the spatial treatment, not merely the input budget, is doing work.
10.2 Where the error lives
RMSE peaks at 1.24 °C at 100 m and falls to 0.27 °C at 1000 m. Via equation (19) this is the expected signature of displacement error acting on a steep background gradient. The same band is the whole of the gap to GLORYS2V4 (0.9572 against our 1.0824 at 75 m) and the gate on the hazard indicators of the previous page. One physical problem, three consequences.
11Limits and failure modes
What this work does not establish
- It is not regional state of the art. Armor3D and GLORYS2V4 are ahead
on identical rows. The internal claim register reads
regional_sota_claim: NOT_ESTABLISHED. - Simultaneous support reaches 10 of 14 depths against INCOIS. The binding constraint is the 96-float sample forcing a ~2.6 critical value, not model quality — more floats or a wider window, not a better architecture.
- Two of the eight GLORYS point wins are hairline (+0.0017, +0.0010 °C), as is 1000 m against INCOIS (+0.0026 °C).
- The surface-only comparison has one rival, and it is a reimplementation rather than published weights, which were fitted for the North Atlantic.
- Six reachable subsurface products is not every product. EN4, ISAS, Ishii and IAP are monthly, so collocating them against daily profiles would compare a different quantity — absent by judgement, not oversight.
- No fresh cohort exists. Every window here has been inspected at least once, so none can be called sealed again. Repeatedly examining a test set until significance appears invalidates its nominal confidence.
- 0 m has no independent validation and is reported separately, never copied from the SST input.
11.1 Errors found by measuring what had been assumed
The following changed a number and are listed because a method that only reports its successful checks has not been checked.
- A comparison mixed potential and in-situ temperature. Correcting it helped us (6/14 → 8/14), which is why it is listed rather than absorbed.
- "Climatology leakage is essentially free" was withdrawn: the label cache was keyed without the climatology, so both arms saw identical labels. The broken run landed within 0.06 pp of the true answer by pure noise — the tell was one seed disagreeing in sign.
- A compliance report quoted an R² from a docstring rather than a measurement.
- A scorer had a network override but no blend override, so a locked weight file sat unread while production weights were scored.
- A required contract item could not fail, because the status line scanned only items that existed. Requirements are now predeclared.
- A monitoring command matched its own process, making a gate unfalsifiable from outside; and a memory gate was set eight times too high from an unattributed reading, idling a shared GPU for hours.
12Resources
12.1 Symbols
| x, d, t | horizontal position; depth in metres positive downward; time |
| Xt, Mt | surface field stack and its validity mask at time t |
| ht | encoder output, the 56-channel embedding artifact |
| mik | joint validity: observation support × both products finite |
| eik, Rk | residual at profile i depth k; per-depth RMSE |
| J14 | mean of the 14 subsurface per-depth RMSEs (≠ pooled RMSE) |
| ℓj | simultaneous one-sided lower bound for comparison j |
| θ, Θ, t | potential, Conservative and in-situ temperature |
| SP, SA | Practical and Absolute Salinity |
| ξ | vertical displacement of the background profile |
12.2 Constants
ρ0 = 1026 kg m−3 · cp = 3985 J kg−1 K−1 · Ω = 7.2921 × 10−5 s−1 · R = 6 371 km · s0 = 1 °C · ε = 10−4 · bootstrap seed 26066, 5 000 resamples.
12.3 References
- McDougall & Barker. Getting started with TEOS-10 and the Gibbs Seawater
(GSW) Oceanographic Toolbox. SCOR/IAPSO WG127. Conversion APIs, unit
conventions and the
z_from_p,SA_from_SP,CT_from_pt,t_from_CTandNsquaredroutines used in §3 and §8.3. teos-10.org - Pauthenet, Bachelot, Balem, Maze et al. Four-dimensional temperature, salinity and mixed-layer depth in the Gulf Stream, reconstructed from remote-sensing and in situ observations with neural networks. Ocean Science, 2022. The OSnet design reimplemented and retrained as the surface-only rival in §10.1. os.copernicus.org
- Wang et al. Attention enhanced 3D-U-Net++ ocean temperature and salinity reconstruction in the northwestern Pacific based on transfer learning. Earth System Science Data, 2026. Precedent for observation pretraining followed by reanalysis fine-tuning. essd.copernicus.org
- Chae, Donohue & Park. TS-Cast. Ocean Science, 2026. Surface-height ambiguity and observation-based reconstruction; the basis for §8.2's refusal to constrain a temperature integral to SSH. os.copernicus.org
- Shay, Goni & Black. Effects of a warm oceanic feature on Hurricane Opal. Monthly Weather Review, 2000; and Mainelli et al., Weather and Forecasting, 2008. Tropical cyclone heat potential and its intensification threshold, used on the Hazards page.
- Hobday et al. A hierarchical approach to defining marine heatwaves. Progress in Oceanography, 2016. The 90th-percentile, five-day definition.
- Mechanisms of Barrier Layer Formation and Erosion from In Situ Observations in the Bay of Bengal. Journal of Physical Oceanography, 2019. Regional salinity stratification; why no monotonicity prior is imposed in §8.3. ametsoc.org
- Kessler. The circulation of the eastern tropical Pacific: dynamics. NOAA PMEL. Ekman transport and pumping derivation used for equation (15). pmel.noaa.gov
- Shalizi. Simulation for Inference I: The Bootstrap. Carnegie Mellon University, 2018. Basic/pivotal interval derivation; equation (20) applies that principle to a predeclared comparison family. stat.cmu.edu
- Jean-Michel et al. The Copernicus Global 1/12° Oceanic and Sea Ice GLORYS12 Reanalysis. Frontiers in Earth Science, 2021. Dense training target and one comparator. frontiersin.org
- Guinehut, Dhomps, Larnicol & Le Traon. High resolution 3D temperature and salinity fields derived from in situ and satellite observations (ARMOR3D). Ocean Science, 2012. The product that leads the ladder in §10, and which interpolates the Argo it is then scored against. os.copernicus.org
- Argo. Argo float data and metadata from Global Data Assembly Centre. SEANOE. Delayed-mode profiles, QC ≤ 2, are the evaluation truth throughout. doi.org/10.17882/42182
12.4 Reproducibility
Every number on the Validation page is produced by a script that refuses to emit a result when its preconditions fail: the row cache must declare the post-repair baseline, the as-shipped arm must reproduce the published headline before any revision is accepted, per-depth verdict flips must reconcile against the aggregate, and the production bundle is checked file-by-file against recorded SHA-256 digests (10 files, 0 changed, 0 missing at time of writing). The suite is 295 tests, 0 failures, including the physical unit tests named in §8.4 and a round-trip test on the temperature conversion of §3.2.