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.

Jump to
Presets
Ready.
Depth m
-
-°C

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 selected
Temperature profile
OceanVision

Click anywhere on the map to fill this panel.

Values at all fifteen depths
Depth mTemp °C

awaiting a point

Water column, 3D depth stack
no depth selected
-
-°C

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 selects
56-dimensional satellite embedding at this point
no dimension

Each 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.

PS contract 5 / 5 All five gates pass Reproducible validation Not the best product in the region
OceanVision
0.6778
°C mean-of-14-depth RMSE, delayed-mode Argo 2023-24
INCOIS analysis
0.8554
the PS's named target, identical rows
Depths won
14 / 14
10 with simultaneous uncertainty support
Climatology
1.0690
the do-nothing floor, beaten 14/14

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 mOceanVision INCOISverdict GLORYS12 in-situverdict
50.38010.4988+0.1187 supported0.3787-0.0105 loss
100.46870.5392+0.0706 point0.4572-0.0192 loss
200.67310.6968+0.0237 point0.6193-0.0421 loss
300.80380.8747+0.0709 point0.7701-0.0295 loss
500.91321.2432+0.3301 supported0.9340+0.0017 hairline
751.12771.6132+0.4855 supported1.1813+0.0557 point
1001.23661.6198+0.3832 supported1.3024+0.0801 supported
1251.09711.3933+0.2962 supported1.1638+0.0808 supported
1500.89601.1050+0.2091 supported0.9176+0.0263 point
2000.63250.7975+0.1651 supported0.6449-0.0129 loss
3000.39180.5569+0.1651 supported0.4779-0.0016 loss
5000.31470.4184+0.1037 supported0.3310+0.0010 hairline
7000.28900.3514+0.0624 supported0.3335+0.0199 supported
10000.26530.2679+0.0026 hairline0.3014+0.0244 point
mean140.67780.855414/14 · 10 supported0.70098/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.

ArmInformation it receivesmean14 We lead byVerdict
OSnet-pubSST + SLA, one snapshot, + position/season — their published set0.9928+0.304314/14 · 13 supported
OSnet-fullall 8 surface fields at 5 lags — our information, their architecture0.7421+0.053613/14 · 13 supported
OceanVisionall 8 fields, 26-day history, spatial U-Net ensemble0.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.

OceanVision, satellite only GLORYS12, assimilates Argo

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 oursRMSE GLORYS Bias oursBias GLORYS Corr oursCorr GLORYS ACC oursACC 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

ProductRMSE °CSees subsurface data?
Armor3D0.3913yes, interpolates Argo directly
GLORYS2V40.5871yes
GLORYS120.6582yes
OceanVision0.6603no, satellite only
C-GLORS0.6915yes
HYCOM GOFS 3.10.7957yes, separate 167-day sample
ORAS50.8083yes
Climatology1.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

ValueWho predictsPredicts whatReference
0.9876full ensembleabsolute temperatureGLORYS12 0.9871
0.5608full ensemblethe anomalyGLORYS12 0.5419
0.4749a straight line, network frozenanomaly, from 56 numbersPCA 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.

ItemVerified byMeasuredState
Domain & gridworst-cell step uniformity, four declared bounds5-30°N, 45-105°E, 101×241, 15 depthspass
Validity maskevery level loses cells to bathymetry, deepest more than surface0.4821 wet at 0 m → 0.3669 at 1000 mpass
Embedding enginegrid match, per-channel variance, probe actually ranR² +0.4749 vs +0.4272 PCApass
INCOIS agreement14 depths covered, three statistics finite, zero time offsetRMSE 0.9-0.95 · bias +0.11 · r 0.80pass
Training lineage (P0)gradient, argmin, stop horizon, checkpoint sha256GLORYS val 0.6262 · independent Argo monitor 0.7271 · stop_metric=gloryspass

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

G0
PASS
Artifact identity. The scorer must consume a manifest whose id is derived, never stored, and refuses to finish unread.
G1
PASS
Observation support. One vertical operator for training and evaluation, using the INCOIS manual's own <50 m / <100 m bracket limits.
G2
PASS
Isolation. Fit-only 1993-2020 climatology throughout. Costs +1.43 %, paid.
G3
PASS
Physical parity. GLORYS converted to in-situ with a real salinity field; the INCOIS window determined from the product's own Argo inputs.
G4
PASS
Paired evaluation. Whole-float resampling, one shared resample across the family, claim predicates that refuse to overclaim.

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.

Step 01

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.

Step 02

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.

Step 03

Reconstruct the column

Four model families predict all fifteen depths, blended with per-depth weights. 26 days of surface history, 246 input channels.

Step 04

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.

FieldProductProvider
Sea-surface temperatureMUR25 L4; OISST v2.1 pre-2003NASA PODAAC / NOAA
Sea-surface salinitySMAP RSS V6, 8-dayNASA PODAAC
Sea-level anomalyDUACS L4 multiyearCopernicus Marine
Currents U, VOSCAR v2.0 FINALNASA PODAAC
Winds U, VCCMP V3.1 dailyNASA PODAAC
Training targetGLORYS12, 1/12° to 3×3 mean to 0.25°Copernicus Marine
ValidationCoriolis Argo, QC ≤ 2, delayed-modeCoriolis / Ifremer

What the ensemble is made of

MemberArchitectureParameters

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.

Profile-mean RMSE in °C: per-depth RMSE at the fifteen mandated depths, then an unweighted mean over depths. Model and reanalysis scored on identical matchup rows. Depths: 0, 5, 10, 20, 30, 50, 75, 100, 125, 150, 200, 300, 500, 700, 1000 m. OceanVision, built by Team ZenTechs for PS 26066, MoES / INCOIS, Smart India Hackathon 2026.

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.

In development Not evaluated Not part of the PS deliverable

Read this before anything below

None of these indicators has been validated, and none is being claimed as a result. They are computed from the same reconstructed profile the Explore page serves, so they inherit its errors — and, as the last card on this page shows, the error they inherit is currently too large for the one indicator that matters most. That is stated here rather than discovered by a reviewer. Nothing on this page feeds the validation numbers, the PS contract, or any claim of skill.

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.

Indicator 01

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.

\[\mathrm{TCHP} \;=\; \rho_0 c_p \int_0^{D_{26}} \bigl[\,T(z) - 26\,\bigr]\; dz\]
Why it matters here. The Bay of Bengal intensifies cyclones fast, and above roughly 50 kJ/cm² rapid intensification becomes markedly more likely. D26 in this basin usually sits between 50 and 120 m, which our 50 / 75 / 100 / 125 / 150 m levels resolve — coarsely, but they resolve it.

Threshold indicator — small profile errors move the isotherm and are amplified, not averaged out.

Indicator 02

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.

\[T(z,t) > T_{90}(z,\mathrm{doy})\ \ \text{for}\ \ge 5\,\mathrm{d}\]
Why it matters here. Subsurface heat drives coral bleaching and fishery displacement below the layer a satellite can see. Our fit-only 1993-2020 climatology is already the right baseline for the percentile, and it is already isolated from the evaluation windows.

Percentile indicator — needs the baseline and the reconstruction to share a bias, or the exceedance count is wrong in a fixed direction.

Indicator 03

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.

\[\mathrm{OHC}' \;\simeq\; \rho_0 c_p \sum_{k} \frac{\Theta'_k + \Theta'_{k+1}}{2}\,\bigl(d_{k+1} - d_k\bigr)\]
Why it matters here. It is the basin-scale integral that ties this work to monsoon and sea-level questions, and it is the cheapest of the four to produce.

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.

Indicator 04

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.

\[\mathrm{BLT} \;=\; \max\bigl(0,\; d_{\mathrm{ILD}} - d_{\mathrm{MLD}}\bigr)\]
Why this one is honestly blocked. dMLD is a density threshold. Density needs salinity at depth, and this model predicts temperature only — surface salinity is an input, not a subsurface output. A temperature-only threshold called "mixed layer depth" would be wrong, so it is not computed.

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.

Hazard indicators are an in-development extension and carry no skill claim. TCHP after Shay et al. (2000) and Mainelli et al. (2008); marine-heatwave definition after Hobday et al. (2016); barrier-layer structure after Thadathil et al. and the Bay of Bengal observational literature. Constants used above: ρ0 = 1026 kg m-3, cp = 3985 J kg-1 K-1. Team ZenTechs, PS 26066, MoES / INCOIS, SIH 2026.

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.

Reconstructing subsurface ocean temperature over the North Indian Ocean from satellite surface fields alone
Team ZenTechs · Smart India Hackathon 2026 · Problem Statement 26066, Ministry of Earth Sciences / INCOIS · 14 September 2026
Abstract

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

\[\mathcal{D} = \{0,\ 5,\ 10,\ 20,\ 30,\ 50,\ 75,\ 100,\ 125,\ 150,\ 200,\ 300,\ 500,\ 700,\ 1000\}\ \mathrm{m}\]

The task is to estimate T(x, t, d) for every d ∈ D from surface information alone. Write the causal encoder-decoder as

(1)\[\mathbf{h}_t = E_\theta\bigl(X_{t-L+1:t},\ M_{t-L+1:t},\ x,\ \text{season}\bigr),\qquad \widehat{\mathbf{T}}_t = D_\psi\bigl(\mathbf{h}_t,\ x\bigr),\qquad L = 26\]

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:

(2)\[\mathbb{E}\bigl[(T - f(X))^2\bigr] \;=\; \mathbb{E}\bigl[\operatorname{Var}(T \mid X)\bigr]\;+\; \mathbb{E}\bigl[(\mathbb{E}[T \mid X] - f(X))^2\bigr]\]

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.

FieldProductProviderRole
Sea-surface temperatureMUR25 L4; OISST v2.1 pre-2003NASA PODAAC / NOAAinput
Sea-surface salinitySMAP RSS V6, 8-dayNASA PODAACinput
Sea-level anomalyDUACS L4 multiyearCopernicus Marineinput
Surface currents U, VOSCAR v2.0 FINALNASA PODAACinput
10 m winds U, VCCMP V3.1 dailyNASA PODAACinput
BathymetryGEBCO, regriddedGEBCOstatic prior
Dense training targetGLORYS12, 1/12° → 3×3 mean → 0.25°Copernicus Marinelabel
Sparse label & validationCoriolis Argo, QC ≤ 2, delayed-modeCoriolis / Ifremerlabel / 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:

(3)\[d_{i\ell} = -\,\mathtt{gsw.z\_from\_p}\bigl(p_{i\ell},\ \phi\bigr),\qquad S_{A,i\ell} = \mathtt{gsw.SA\_from\_SP}\bigl(S_{P,i\ell},\ p_{i\ell},\ \lambda,\ \phi\bigr)\]

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:

(4)\[S_A = \mathtt{SA\_from\_SP}(S_P, p, \lambda, \phi)\;\longrightarrow\;\Theta = \mathtt{CT\_from\_pt}(S_A, \theta)\;\longrightarrow\;t = \mathtt{t\_from\_CT}(S_A, \Theta, p)\]

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.

(5)\[\widehat{y}_{ik} = H_i\bigl[\widehat{T}(\cdot,\cdot,d_k)\bigr],\qquad y_{ik} = I_i(d_k),\qquad e_{ik} = \widehat{y}_{ik} - y_{ik}\]

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:

(6)\[n_k = \sum_i m_{ik},\qquad \mathrm{MSE}_k = \frac{\sum_i m_{ik}\,e_{ik}^{2}}{n_k},\qquad R_k = \sqrt{\mathrm{MSE}_k},\qquad J_{14} = \frac{1}{14}\sum_{k\,:\,d_k>0} R_k\]

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:

(7)\[\mathcal{L}_A = \frac{1}{\lvert\mathcal{K}_B\rvert}\sum_{k \in \mathcal{K}_B}\sqrt{\;\frac{\sum_{i \in B} m_{ik}\,(e_{ik}/s_0)^{2}}{\sum_{i \in B} m_{ik}} \;+\; \epsilon^{2}\;}\]

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:

(8)\[\mathcal{L}_G = \frac{1}{15}\sum_k\frac{\sum_{t,j} A_j q_{jk}\bigl[(\widehat{T}_{tjk} - G_{tjk})/s_k\bigr]^{2}}{\sum_{t,j} A_j q_{jk}},\qquad \mathcal{L} = \mathcal{L}_A + \lambda_G\,\mathcal{L}_G\]

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

(9)\[\frac{\partial J_{14}}{\partial \widehat{y}_{ik}} = \frac{e_{ik}}{14\,n_k R_k},\qquad R_k > 0\]

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:

(10)\[c = \frac{\bigl\langle \nabla_\theta \mathcal{L}_A,\ \nabla_\theta \mathcal{L}_G \bigr\rangle}{\lVert \nabla_\theta \mathcal{L}_A \rVert\;\lVert \nabla_\theta \mathcal{L}_G \rVert + \varepsilon}\]

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.

PropertyValueNote
Input246 × 101 × 24126 frames × 9 fields + 12 static
Output15 × 101 × 241all depths in one forward pass
Encoder depth4down/up stages
Base width56this is the exported embedding width
Dropout0.2overfitting-limited regime
OptimiserAdamW, lr 6×10-4, wd 3×10-420 % warmup
Batch16 dayswhole fields, not point samples
Training VRAM4 124 MiBmeasured 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

# fit window 1993-2020 for climatology; labels to 2020; stopping year 2021precompute C ← surface climatology over FIT YEARS ONLY # G2 D ← day cache, 246 ch/day, causal 26-day frames Y ← Argo labels via operator H, mask m^obs # G1for epoch = 1 .. E: for batch B of 16 days: X ← D[B] # no field dated > t enters X T̂ ← Dψ(Eθ(X)) # (1), 15 depths at once L ← ℒA(T̂, Y, m) + λG ℒG(T̂, G, q, A) # (7), (8) log c = cos(∇ℒA, ∇ℒG) # (10), diagnostic only θ, ψ ← AdamW step on ∇L # selection clock is declared ONCE, before the run s ← J14 on STOP YEAR using stop_metric # 'argo' or 'glorys' if s < best: best ← s; save(ckpt); bad ← 0 else: bad ← bad + 1 if bad > patience: break

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

input target date t, 26 days of surface fields up to tassert no subsurface field is read anywhere belowframes ← [harmonise(day) for day in t-25 .. t] # 0.25 deg, 101x241curl ← wind_curl(uwind, vwind) # ABSOLUTE winds, see belowX ← concat(frames × 9ch, clim7, coords2, doy2, bathy1)for member m in ensemble: Pm ← m(X) # each emits 15 x 101 x 241T̂ ← sum_m w[k,m] * P_m where w[k] ≥ 0, sum_m w[k,m] = 1 # per-depth simplex, eq (11)T̂ ← mask_to_bathymetry(T̂) # no water below the seabed

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:

(11)\[\min_{\mathbf{w}_k \ge 0,\;\mathbf{1}^{\mathsf{T}}\mathbf{w}_k = 1}\;\frac{1}{n_k}\sum_i m_{ik}\bigl(\mathbf{p}_{ik}^{\mathsf{T}}\mathbf{w}_k - y_{ik}\bigr)^{2}\;+\;\gamma\,\lVert \mathbf{w}_k - \mathbf{w}_{0k} \rVert_2^{2}\]

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,

(12)\[\mathrm{MSE}_{\mathrm{blend},k} = \mathbf{w}_k^{\mathsf{T}}\boldsymbol{\Sigma}_k\mathbf{w}_k\;+\;\bigl(\mathbf{w}_k^{\mathsf{T}}\mathbf{b}_k\bigr)^{2}\]

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,

(13)\[\boldsymbol{\tau} = \rho_a\,C_D\bigl(\lvert\mathbf{U}^{\mathrm{rel}}_{10}\rvert\bigr)\,\lvert\mathbf{U}^{\mathrm{rel}}_{10}\rvert\,\mathbf{U}^{\mathrm{rel}}_{10},\qquad \mathbf{U}^{\mathrm{rel}}_{10} = \mathbf{U}_{10} - \mathbf{u}_s\]

Stress is in N/m². For eastward/northward components (Aλ, Aφ) the radial curl on a sphere is

(14)\[(\nabla \times \mathbf{A})_r = \frac{1}{R\cos\phi}\left[\frac{\partial A_\phi}{\partial \lambda} - \frac{\partial (A_\lambda \cos\phi)}{\partial \phi}\right]\]

With f = 2Ω sin φ, the large-scale Ekman pumping diagnostic, positive upward, is

(15)\[w_E = \left[\nabla \times \left(\frac{\boldsymbol{\tau}}{\rho_0 f}\right)\right]_r,\qquad f = 2\Omega\sin\phi\]

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

(16)\[u_g = -\frac{g}{f}\frac{\partial \eta}{\partial y},\qquad v_g = \phantom{-}\frac{g}{f}\frac{\partial \eta}{\partial x}\]

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

(17)\[N^{2} \;\simeq\; g\bigl(\beta\,\partial_d S_A \;-\; \alpha\,\partial_d \Theta\bigr)\]

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:

(18)\[g_k = \frac{T_{k+1} - T_k}{\Delta d_k},\qquad c_k = \frac{2\,(g_k - g_{k-1})}{d_{k+1} - d_{k-1}}\]

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

(19)\[T(d) \;\simeq\; B(d - \xi) \;\simeq\; B(d) \;-\; \xi\,\partial_d B(d)\]

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.

G0
artifact identity
The scorer consumes a manifest whose id is derived, never stored, and refuses to finish unread.
G1
observation support
One vertical operator for training and evaluation, with the bracket limits of §3.3.
G2
isolation
Fit-only 1993-2020 climatology throughout, costing 1.43 %.
G3
physical parity
Comparators converted into one temperature convention; the analysis window measured, not assumed.
G4
paired evaluation
Whole-float resampling, one shared resample across the family, predicates that refuse to overclaim.

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

(20)\[q_{.95} = Q_{.95}\!\left[\;\max_j \frac{\widehat{\delta}^{*(b)}_j - \widehat{\delta}_j}{s_j}\;\right],\qquad \ell_j = \widehat{\delta}_j - q_{.95}\,s_j\]

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.

ContrastOceanVisionThem Point winsSimultaneous
INCOIS operational analysis0.67780.855414 / 1410 / 14
GLORYS12, converted to in-situ0.68850.70098 / 143 / 14
OSnet-full (our inputs, their architecture)0.68850.742113 / 1413 / 14
OSnet-pub (SST + SLA, one snapshot)0.68850.992814 / 1413 / 14
Monthly climatology0.67781.069014 / 1413 / 14
Armor3D ahead of us0.66030.3913——
GLORYS2V4 ahead of us0.66030.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, thorizontal position; depth in metres positive downward; time
Xt, Mtsurface field stack and its validity mask at time t
htencoder output, the 56-channel embedding artifact
mikjoint validity: observation support × both products finite
eik, Rkresidual at profile i depth k; per-depth RMSE
J14mean of the 14 subsurface per-depth RMSEs (≠ pooled RMSE)
ℓjsimultaneous one-sided lower bound for comparison j
θ, Θ, tpotential, Conservative and in-situ temperature
SP, SAPractical 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

  1. 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_CT and Nsquared routines used in §3 and §8.3. teos-10.org
  2. 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
  3. 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
  4. 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
  5. 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.
  6. Hobday et al. A hierarchical approach to defining marine heatwaves. Progress in Oceanography, 2016. The 90th-percentile, five-day definition.
  7. 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
  8. Kessler. The circulation of the eastern tropical Pacific: dynamics. NOAA PMEL. Ekman transport and pumping derivation used for equation (15). pmel.noaa.gov
  9. 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
  10. 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
  11. 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
  12. 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.