[{"content":"AMM7 Analysis Overview This page summarises the analyses available for the AMM7 area, organised by type. Use the table of contents to jump to a specific section.\nTidal Analysis TPXO9 — 2019-2022\nConstituent Amp err (m) Phase err (°) M2 0.121 14.5 S2 0.038 14.3 K1 0.023 27.1 O1 0.013 18.0 2019-2022 Horizontal Surface Validation 📊 View Horizontal Surface Validation rankings for AMM7 →\nBaseline — 2016-2023\nVariable Dataset RMSE Bias Corr SALT CCI-SSS 1.003 +0.276 0.60 TEMP CCI-SST 0.901 +0.384 0.96 TEMP OSTIA 0.916 +0.392 0.97 2016-2023 CMEMS — 2016-2022–2016-2023\nVariable Dataset RMSE Bias Corr SALT CCI-SSS 1.061 -0.032 0.84 TEMP CCI-SST 1.098 +0.678 0.96 TEMP OSTIA 1.141 +0.688 0.96 2016-2022 · 2016-2023 CMEMS_prof — 2016-2022–2016-2023\nVariable Dataset RMSE Bias Corr SALT CCI-SSS 0.886 +0.080 0.83 TEMP CCI-SST 1.003 +0.476 0.96 TEMP OSTIA 1.027 +0.419 0.95 2016-2022 · 2016-2023 NetSW_LW — 2016-2023\nVariable Dataset RMSE Bias Corr SALT CCI-SSS 1.008 +0.286 0.60 TEMP CCI-SST 0.928 +0.401 0.96 TEMP OSTIA 0.941 +0.421 0.96 2016-2023 ObsKd — 2016-2023\nVariable Dataset RMSE Bias Corr SALT CCI-SSS 1.018 +0.303 0.59 TEMP CCI-SST 0.980 +0.549 0.96 TEMP OSTIA 0.988 +0.574 0.97 2016-2023 Horizontal Bottom Layer Validation No horizontal bottom-layer validation has been performed for this area yet.\nGridded 3D Validation 📊 View Gridded 3D Validation rankings for AMM7 →\nBaseline — 2016-2023\nVariable Dataset RMSE Bias Corr SALT WOA 0.392 -0.028 0.60 TEMP WOA 2.607 -1.046 0.84 2016-2023 CMEMS — 2016-2022–2016-2023\nVariable Dataset RMSE Bias Corr SALT WOA 0.619 -0.121 0.69 TEMP WOA 2.773 -0.973 0.82 2016-2022 · 2016-2023 CMEMS_prof — 2016-2022–2016-2023\nVariable Dataset RMSE Bias Corr SALT WOA 0.484 -0.130 0.70 TEMP WOA 2.960 -1.339 0.80 2016-2022 · 2016-2023 ObsKd — 2016-2023\nVariable Dataset RMSE Bias Corr SALT WOA 0.443 -0.045 0.54 TEMP WOA 2.508 -0.744 0.85 2016-2023 World Ocean Data Comparison No World Ocean Atlas comparison has been performed for this area yet.\nCruise CTD Profiles No cruise CTD profile validation has been performed for this area yet.\nFixed Platform Validation No fixed platform (mooring/buoy) validation has been performed for this area yet.\nArgo Profile Validation 📊 View Argo Profile Validation rankings for AMM7 →\nBaseline — 2016-2023\nVariable Dataset RMSE Bias Corr PSAL_ARGO ARGO floats 4.334 +0.665 0.17 TEMP_ARGO ARGO floats 1.265 +0.203 0.96 2016-2023 CMEMS — 2016-2022–2016-2023\nVariable Dataset RMSE Bias Corr PSAL_ARGO ARGO floats 4.328 +0.636 0.18 TEMP_ARGO ARGO floats 1.243 +0.270 0.97 2016-2022 · 2016-2023 CMEMS_prof — 2016-2022–2016-2023\nVariable Dataset RMSE Bias Corr PSAL_ARGO ARGO floats 4.325 +0.571 0.16 TEMP_ARGO ARGO floats 1.383 -0.302 0.95 2016-2022 · 2016-2023 NetSW_LW — 2016-2023\nVariable Dataset RMSE Bias Corr PSAL_ARGO ARGO floats 4.334 +0.663 0.17 TEMP_ARGO ARGO floats 1.320 +0.262 0.96 2016-2023 ObsKd — 2016-2023\nVariable Dataset RMSE Bias Corr PSAL_ARGO ARGO floats 4.334 +0.665 0.18 TEMP_ARGO ARGO floats 1.324 +0.300 0.96 2016-2023 ICES Point Observation Profiles 📊 View ICES Point Observation Profiles rankings for AMM7 →\nBaseline — 2016-2023\nVariable Dataset RMSE Bias Corr PSAL_ICES ICES point observations 1.043 +0.204 0.68 TEMP_ICES ICES point observations 1.186 +0.101 0.96 2016-2023 CMEMS — 2016-2022–2016-2023\nVariable Dataset RMSE Bias Corr PSAL_ICES ICES point observations 0.945 -0.102 0.82 TEMP_ICES ICES point observations 1.323 +0.423 0.95 2016-2022 · 2016-2023 CMEMS_prof — 2016-2022–2016-2023\nVariable Dataset RMSE Bias Corr AMON_ICES ICES point observations 2.383 -0.750 0.20 DOXY_ICES ICES point observations 24.188 +1.188 0.70 NTRA_ICES ICES point observations 16.256 +6.932 0.43 PHOS_ICES ICES point observations 0.479 -0.042 0.50 PH_ICES ICES point observations 0.536 -0.090 -0.02 PSAL_ICES ICES point observations 0.835 -0.004 0.83 SLCA_ICES ICES point observations 46.769 +8.271 0.21 TEMP_ICES ICES point observations 1.590 +0.456 0.93 2016-2022 · 2016-2023 NetSW_LW — 2016-2023\nVariable Dataset RMSE Bias Corr PSAL_ICES ICES point observations 1.044 +0.213 0.68 TEMP_ICES ICES point observations 1.193 +0.307 0.96 2016-2023 ObsKd — 2016-2023\nVariable Dataset RMSE Bias Corr PSAL_ICES ICES point observations 1.056 +0.231 0.68 TEMP_ICES ICES point observations 1.220 +0.404 0.96 2016-2023 World Ocean Database Profiles No World Ocean Database profile validation has been performed for this area yet.\nGLODAP Profiles No GLODAP profile validation has been performed for this area yet.\nMLE Cross-Experiment Ranking mle_comparison — 2016-2023 2016-2023 Notes ","permalink":"https://bolding-bruggeman.com/oceanicu_3d/validations/amm7/overview/","summary":"\u003ch1 id=\"amm7-analysis-overview\"\u003eAMM7 Analysis Overview\u003c/h1\u003e\n\u003cp\u003eThis page summarises the analyses available for the \u003cstrong\u003eAMM7\u003c/strong\u003e area, organised by type.  Use the table of contents to jump to a specific section.\u003c/p\u003e\n\u003c!-- BEGIN GENERATED OVERVIEW — do not edit this section --\u003e\n\u003ch2 id=\"tidal-analysis\"\u003eTidal Analysis\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003e\u003ca href=\"/validations/amm7-tpxo9/\"\u003eTPXO9\u003c/a\u003e\u003c/strong\u003e — 2019-2022\u003c/p\u003e\n\u003ctable\u003e\n  \u003cthead\u003e\n      \u003ctr\u003e\n          \u003cth\u003eConstituent\u003c/th\u003e\n          \u003cth\u003eAmp err (m)\u003c/th\u003e\n          \u003cth\u003ePhase err (°)\u003c/th\u003e\n      \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eM2\u003c/td\u003e\n          \u003ctd\u003e0.121\u003c/td\u003e\n          \u003ctd\u003e14.5\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eS2\u003c/td\u003e\n          \u003ctd\u003e0.038\u003c/td\u003e\n          \u003ctd\u003e14.3\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eK1\u003c/td\u003e\n          \u003ctd\u003e0.023\u003c/td\u003e\n          \u003ctd\u003e27.1\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eO1\u003c/td\u003e\n          \u003ctd\u003e0.013\u003c/td\u003e\n          \u003ctd\u003e18.0\u003c/td\u003e\n      \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"/validations/amm7-tpxo9/#year-2019-2022\"\u003e2019-2022\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"horizontal-surface-validation\"\u003eHorizontal Surface Validation\u003c/h2\u003e\n\u003cp\u003e📊 \u003cstrong\u003e\u003ca href=\"/rankings/amm7/#horizon-surface\"\u003eView Horizontal Surface Validation rankings for AMM7 →\u003c/a\u003e\u003c/strong\u003e\u003c/p\u003e","title":"AMM7 — Analysis Overview"},{"content":"NS Analysis Overview This page summarises the analyses available for the NS area, organised by type. Use the table of contents to jump to a specific section.\nTidal Analysis No tidal analysis has been performed for this area yet.\nHorizontal Surface Validation CMEMS — 2016-2023\nVariable Dataset RMSE Bias Corr SALT CCI-SSS 2.233 -0.101 0.92 TEMP CCI-SST 0.854 +0.402 0.92 TEMP OSTIA 0.860 +0.197 0.90 2016-2023 Horizontal Bottom Layer Validation CMEMS — 2016-2023\nVariable Dataset RMSE Bias Corr SALT NWS-salinity 0.488 +0.075 0.84 TEMP NWS-bottomT 1.412 -0.614 0.92 2016-2023 Gridded 3D Validation CMEMS — 2016-2023\nVariable Dataset RMSE Bias Corr SALT WOA 1.866 -0.405 0.85 TEMP WOA 1.671 +1.019 0.92 2016-2023 World Ocean Data Comparison No World Ocean Atlas comparison has been performed for this area yet.\nCruise CTD Profiles No cruise CTD profile validation has been performed for this area yet.\nFixed Platform Validation No fixed platform (mooring/buoy) validation has been performed for this area yet.\nArgo Profile Validation 📊 View Argo Profile Validation rankings for NS →\nAdaptive_1 — 2016-2023\nVariable Dataset RMSE Bias Corr PSAL_ARGO ARGO floats 0.692 -0.249 0.69 TEMP_ARGO ARGO floats 1.052 -0.251 0.91 2016-2023 Adaptive_2 — 2016-2023\nVariable Dataset RMSE Bias Corr PSAL_ARGO ARGO floats 0.684 -0.236 0.69 TEMP_ARGO ARGO floats 1.064 -0.212 0.89 2016-2023 Adaptive_3 — 2016-2023\nVariable Dataset RMSE Bias Corr PSAL_ARGO ARGO floats 0.714 -0.265 0.66 TEMP_ARGO ARGO floats 1.103 -0.186 0.88 2016-2023 Baseline — 2016-2023\nVariable Dataset RMSE Bias Corr PSAL_ARGO ARGO floats 0.707 -0.257 0.67 TEMP_ARGO ARGO floats 1.096 -0.197 0.89 2016-2023 CMEMS — 2016-2023\nVariable Dataset RMSE Bias Corr PSAL_ARGO ARGO floats 0.450 -0.140 0.88 TEMP_ARGO ARGO floats 1.034 +0.199 0.88 2016-2023 ObsKd — 2016-2023\nVariable Dataset RMSE Bias Corr PSAL_ARGO ARGO floats 0.704 -0.244 0.67 TEMP_ARGO ARGO floats 1.084 -0.041 0.87 2016-2023 SSRD_STRD — 2016-2023\nVariable Dataset RMSE Bias Corr PSAL_ARGO ARGO floats 0.708 -0.254 0.66 TEMP_ARGO ARGO floats 1.099 -0.168 0.88 2016-2023 SSR_SRT — 2016-2023\n2016-2023 SSR_STR — 2016-2023\nVariable Dataset RMSE Bias Corr PSAL_ARGO ARGO floats 0.710 -0.261 0.66 TEMP_ARGO ARGO floats 1.124 -0.211 0.88 2016-2023 ICES Point Observation Profiles 📊 View ICES Point Observation Profiles rankings for NS →\nAdaptive_1 — 2016-2023\nVariable Dataset RMSE Bias Corr PSAL_ICES ICES point observations 2.598 +0.542 0.95 TEMP_ICES ICES point observations 1.516 -0.382 0.91 2016-2023 Adaptive_2 — 2016-2023\nVariable Dataset RMSE Bias Corr PSAL_ICES ICES point observations 2.601 +0.548 0.95 TEMP_ICES ICES point observations 1.528 -0.388 0.91 2016-2023 Adaptive_3 — 2016-2023\nVariable Dataset RMSE Bias Corr PSAL_ICES ICES point observations 2.601 +0.544 0.95 TEMP_ICES ICES point observations 1.515 -0.380 0.91 2016-2023 Baseline — 2016-2023\nVariable Dataset RMSE Bias Corr PSAL_ICES ICES point observations 2.607 +0.540 0.95 TEMP_ICES ICES point observations 1.522 -0.385 0.91 2016-2023 CMEMS — 2016-2023\nVariable Dataset RMSE Bias Corr PSAL_ICES ICES point observations 2.919 -0.852 0.95 TEMP_ICES ICES point observations 1.353 +0.086 0.92 2016-2023 ObsKd — 2016-2023\nVariable Dataset RMSE Bias Corr PSAL_ICES ICES point observations 2.643 +0.574 0.95 TEMP_ICES ICES point observations 1.381 -0.100 0.93 2016-2023 SSRD_STRD — 2016-2023\nVariable Dataset RMSE Bias Corr PSAL_ICES ICES point observations 2.651 +0.583 0.95 TEMP_ICES ICES point observations 1.496 -0.299 0.91 2016-2023 SSR_STR — 2016-2023\nVariable Dataset RMSE Bias Corr PSAL_ICES ICES point observations 2.613 +0.548 0.95 TEMP_ICES ICES point observations 1.533 -0.375 0.91 2016-2023 World Ocean Database Profiles No World Ocean Database profile validation has been performed for this area yet.\nGLODAP Profiles No GLODAP profile validation has been performed for this area yet.\nMLE Cross-Experiment Ranking mle_comparison — 2016-2023 2016-2023 Notes ","permalink":"https://bolding-bruggeman.com/oceanicu_3d/validations/ns/overview/","summary":"\u003ch1 id=\"ns-analysis-overview\"\u003eNS Analysis Overview\u003c/h1\u003e\n\u003cp\u003eThis page summarises the analyses available for the \u003cstrong\u003eNS\u003c/strong\u003e area, organised by type.  Use the table of contents to jump to a specific section.\u003c/p\u003e\n\u003c!-- BEGIN GENERATED OVERVIEW — do not edit this section --\u003e\n\u003cdiv style=\"opacity: 0.35; pointer-events: none\"\u003e\n\u003ch2 id=\"tidal-analysis\"\u003eTidal Analysis\u003c/h2\u003e\n\u003cp\u003e\u003cem\u003eNo tidal analysis has been performed for this area yet.\u003c/em\u003e\u003c/p\u003e\n\u003c/div\u003e\n\u003ch2 id=\"horizontal-surface-validation\"\u003eHorizontal Surface Validation\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003e\u003ca href=\"/validations/ns-cmems/\"\u003eCMEMS\u003c/a\u003e\u003c/strong\u003e — 2016-2023\u003c/p\u003e\n\u003ctable\u003e\n  \u003cthead\u003e\n      \u003ctr\u003e\n          \u003cth\u003eVariable\u003c/th\u003e\n          \u003cth\u003eDataset\u003c/th\u003e\n          \u003cth\u003eRMSE\u003c/th\u003e\n          \u003cth\u003eBias\u003c/th\u003e\n          \u003cth\u003eCorr\u003c/th\u003e\n      \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eSALT\u003c/td\u003e\n          \u003ctd\u003eCCI-SSS\u003c/td\u003e\n          \u003ctd\u003e2.233\u003c/td\u003e\n          \u003ctd\u003e-0.101\u003c/td\u003e\n          \u003ctd\u003e0.92\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eTEMP\u003c/td\u003e\n          \u003ctd\u003eCCI-SST\u003c/td\u003e\n          \u003ctd\u003e0.854\u003c/td\u003e\n          \u003ctd\u003e+0.402\u003c/td\u003e\n          \u003ctd\u003e0.92\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eTEMP\u003c/td\u003e\n          \u003ctd\u003eOSTIA\u003c/td\u003e\n          \u003ctd\u003e0.860\u003c/td\u003e\n          \u003ctd\u003e+0.197\u003c/td\u003e\n          \u003ctd\u003e0.90\u003c/td\u003e\n      \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"/validations/ns-cmems/#year-2016-2023\"\u003e2016-2023\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"horizontal-bottom-layer-validation\"\u003eHorizontal Bottom Layer Validation\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003e\u003ca href=\"/validations/ns-cmems/\"\u003eCMEMS\u003c/a\u003e\u003c/strong\u003e — 2016-2023\u003c/p\u003e","title":"NS — Analysis Overview"},{"content":"NSe Analysis Overview This page summarises the analyses available for the NSe area, organised by type. Use the table of contents to jump to a specific section.\nTidal Analysis 📊 View Tidal Analysis rankings for NSe →\nCMEMS/tidal — 2011\nConstituent Amp err (m) Phase err (°) M2 0.432 22.1 S2 0.146 23.8 K1 0.015 36.9 O1 0.028 24.2 2011 CMIP6/tidal — 2011-2011\nConstituent Amp err (m) Phase err (°) M2 0.143 90.6 S2 0.044 19.6 K1 0.005 38.2 O1 0.011 109.8 2011-2011 WOA/tidal — 2010–2011\nConstituent Amp err (m) Phase err (°) M2 0.134 17.9 S2 0.042 19.2 K1 0.006 25.0 O1 0.012 20.6 2010 · 2011 Horizontal Surface Validation 📊 View Horizontal Surface Validation rankings for NSe →\nCMEMS/spinup — 2011-2013\nVariable Dataset RMSE Bias Corr TEMP OSTIA 1.115 +0.507 0.90 2011-2013 CMEMS/v01P — 2010–2013\nVariable Dataset RMSE Bias Corr SALT CCI-SSS 3.379 -1.532 0.89 TEMP CCI-SST 1.012 +0.190 0.91 TEMP OISST 1.089 +0.189 0.91 TEMP OSTIA 1.021 +0.082 0.91 2010 · 2010-2013 · 2011 · 2012 · 2013 CMIP6_raw/GFDL-ESM4-ssp126/run01 — 2010-2049\n2010-2049 Horizontal Bottom Layer Validation CMEMS/v01P — 2010–2013\nVariable Dataset RMSE Bias Corr SALT NWS-salinity 0.690 -0.303 0.89 TEMP NWS-bottomT 1.425 -0.587 0.92 2010 · 2010-2013 · 2011 · 2012 · 2013 Gridded 3D Validation CMEMS/v01P — 2010–2013 2010 · 2010-2013 · 2011 · 2012 · 2013 World Ocean Data Comparison No World Ocean Atlas comparison has been performed for this area yet.\nCruise CTD Profiles CMEMS/v01P — 2010–2013 2010 · 2010-2013 · 2011 · 2012 · 2013 Fixed Platform Validation No fixed platform (mooring/buoy) validation has been performed for this area yet.\nArgo Profile Validation CMEMS/v01P — 2010–2013 2010 · 2010-2013 · 2011 · 2012 · 2013 ICES Point Observation Profiles CMEMS/v01P — 2010–2013\nVariable Dataset RMSE Bias Corr PSAL_ICES ICES point observations 1.962 -0.728 0.91 TEMP_ICES ICES point observations 1.401 -0.414 0.90 2010 · 2010-2013 · 2011 · 2012 · 2013 World Ocean Database Profiles No World Ocean Database profile validation has been performed for this area yet.\nGLODAP Profiles No GLODAP profile validation has been performed for this area yet.\nMLE Cross-Experiment Ranking No MLE cross-experiment comparison has been performed for this area yet.\nNotes ","permalink":"https://bolding-bruggeman.com/oceanicu_3d/validations/nse/overview/","summary":"\u003ch1 id=\"nse-analysis-overview\"\u003eNSe Analysis Overview\u003c/h1\u003e\n\u003cp\u003eThis page summarises the analyses available for the \u003cstrong\u003eNSe\u003c/strong\u003e area, organised by type.  Use the table of contents to jump to a specific section.\u003c/p\u003e\n\u003c!-- BEGIN GENERATED OVERVIEW — do not edit this section --\u003e\n\u003ch2 id=\"tidal-analysis\"\u003eTidal Analysis\u003c/h2\u003e\n\u003cp\u003e📊 \u003cstrong\u003e\u003ca href=\"/rankings/nse/#tides\"\u003eView Tidal Analysis rankings for NSe →\u003c/a\u003e\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003e\u003ca href=\"/validations/nse-cmems-tidal/\"\u003eCMEMS/tidal\u003c/a\u003e\u003c/strong\u003e — 2011\u003c/p\u003e\n\u003ctable\u003e\n  \u003cthead\u003e\n      \u003ctr\u003e\n          \u003cth\u003eConstituent\u003c/th\u003e\n          \u003cth\u003eAmp err (m)\u003c/th\u003e\n          \u003cth\u003ePhase err (°)\u003c/th\u003e\n      \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eM2\u003c/td\u003e\n          \u003ctd\u003e0.432\u003c/td\u003e\n          \u003ctd\u003e22.1\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eS2\u003c/td\u003e\n          \u003ctd\u003e0.146\u003c/td\u003e\n          \u003ctd\u003e23.8\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eK1\u003c/td\u003e\n          \u003ctd\u003e0.015\u003c/td\u003e\n          \u003ctd\u003e36.9\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eO1\u003c/td\u003e\n          \u003ctd\u003e0.028\u003c/td\u003e\n          \u003ctd\u003e24.2\u003c/td\u003e\n      \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"/validations/nse-cmems-tidal/#year-2011\"\u003e2011\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003e\u003ca href=\"/validations/nse-cmip6-tidal/\"\u003eCMIP6/tidal\u003c/a\u003e\u003c/strong\u003e — 2011-2011\u003c/p\u003e","title":"NSe — Analysis Overview"},{"content":"Tidal Analysis Guide Overview tidal-analysis extracts tidal harmonic constituents from model output and validates them against satellite tidal atlases (FES2014, TPXO9) or tide gauge records from the GESLA database.\nThe harmonic analysis uses utide to fit sinusoidal components at each grid point or station location. Model amplitudes and phases are then compared to the reference atlas or gauge data.\nAnalysis modes Mode Flag Description gesla --mode gesla Harmonic analysis at GESLA tide gauge locations (fast; recommended; config default) spatial --mode spatial Harmonic analysis on the full model grid, compared to a tidal atlas both --mode both Run spatial and GESLA together stations --mode stations Named stations listed under stations: in config Model source: --source / --experiment The model file to read no longer lives in the per-run config. It comes from config/sources.yaml, keyed by --source, with --experiment naming the run folder under that source:\ntidal-analysis --config config/tidal_analysis.yaml --source CMEMS --experiment tidal --years 2011 2011 --experiment is required whenever --source is given — it is the run folder name (e.g. tidal, run01), not the full output label. The CLI builds the output label itself as \u0026lt;SOURCE\u0026gt;/\u0026lt;experiment\u0026gt; (and \u0026lt;SOURCE\u0026gt;/\u0026lt;model\u0026gt;-\u0026lt;scenario\u0026gt;/\u0026lt;experiment\u0026gt; for CMIP6/CMIP6_raw, via --model/--scenario), so config['experiment'] in the printed summary is already the composite name.\nCurrent sources for NSe: CMEMS, WOA, CMIP6 (bias-corrected forcing), CMIP6_raw (forcing without bias correction — e.g. the ssp126 run). CMIP6 vs CMIP6_raw is a real distinction, not a typo: use CMIP6_raw for any run whose atmospheric forcing was not bias-corrected.\nWithout --source, the config\u0026rsquo;s own model.base_path / model.filename_pattern are required instead (the pre-sources.yaml way); that path still works but is no longer how NSe runs are set up.\nConfig structure Annotated example: config/tidal_analysis.yaml\n# config/tidal_analysis.yaml area: NSe experiment: TPXO9 # overridden by --experiment when --source is used years: [2020, 2022] # loads and concatenates 2020, 2021, 2022 # For a single year use: year: 2022 constituents: - M2 - S2 - K1 - O1 # ... N2, K2, P1, Q1 gesla: path: ${GESLA_FOLDER}/122848.csv amp_units: cm filters: type: Coastal min_years: 2 coverage: grid grid_deg: 1.0 stations: # named stations for --mode stations - name: Aberdeen lon: -2.08 lat: 57.14 reference: # spatial-mode atlas type: FES2014 path: ${TIDAL_FOLDER}/FES2014/ocean_tide.nc model: name: \u0026#34;pyGETM\u0026#34; # File location and the SSH variable come from config/sources.yaml when # --source is given; see the --source section above. output: analyses_dir: \u0026#34;${OCEANICU_ANALYSES_FOLDER}\u0026#34; # no default — see below plots: true statistics: true analysis: mode: gesla Required keys: area, experiment, and (only without --source) model.base_path, model.filename_pattern.\noutput.analyses_dir has no default analyses_dir must resolve to a real path — there is no ./analyses fallback. It is expanded from OCEANICU_ANALYSES_FOLDER in this machine\u0026rsquo;s data-roots file (\u0026lt;hostname\u0026gt;_ocean-post_data_roots.yaml), or set directly with --analyses-dir. If neither is set, the run stops immediately with an error naming the missing variable, rather than writing output somewhere unexpected (e.g. inside the code checkout).\nUsage # CMEMS, --source form (current NSe workflow) tidal-analysis --config config/tidal_analysis.yaml --source CMEMS --experiment tidal --years 2011 2011 --workers 16 # WOA tidal-analysis --config config/tidal_analysis.yaml --source WOA --experiment tidal --years 2011 2011 --workers 16 # CMIP6 historical tidal-analysis --config config/tidal_analysis.yaml --source CMIP6 --experiment tidal --years 2011 2011 --workers 16 # Spatial mode, single constituent tidal-analysis --config config/tidal_analysis.yaml --source CMEMS --experiment tidal --mode spatial --constituents M2 # GESLA stations only (also the config default) tidal-analysis --config config/tidal_analysis.yaml --source CMEMS --experiment tidal --mode gesla # Append to an existing statistics file (useful when running multiple datasets) tidal-analysis --config config/tidal_analysis.yaml --source CMEMS --experiment tidal \\ --dataset-name \u0026#34;FES2014\u0026#34; --append-stats Output \u0026lt;OCEANICU_ANALYSES_FOLDER\u0026gt;/areas/\u0026lt;AREA\u0026gt;/validations/\u0026lt;SOURCE\u0026gt;/\u0026lt;experiment\u0026gt;/ ├── plots/ │ └── physics/ │ └── pyGETM/ │ └── \u0026lt;period\u0026gt;/ ← e.g. 2011 │ └── tidal/ │ ├── \u0026lt;const\u0026gt;_comparison_\u0026lt;...\u0026gt;.png │ └── gesla_station_comparison_maps_{diurnal,semidiurnal}.png └── tables/ └── physics/ └── pyGETM/ └── tidal/ ├── gesla_station_comparison.csv ← one row per station × constituent └── tidal_validation_statistics.txt For CMIP6/CMIP6_raw, the path is .../\u0026lt;SOURCE\u0026gt;/\u0026lt;model\u0026gt;-\u0026lt;scenario\u0026gt;/\u0026lt;experiment\u0026gt;/..., e.g. CMIP6_raw/GFDL-ESM4-ssp126/run01/.\nResults are also written to the shared statistics database (analyses/statistics.db, table tidal_statistics) keyed on area + experiment (the composite \u0026lt;SOURCE\u0026gt;/\u0026lt;experiment\u0026gt; label), unless --no-staging is given.\nStatistics file format tidal_validation_statistics.txt has one section per constituent with area-averaged metrics:\nM2 Amplitude RMSE: 0.032 m Bias: -0.008 m Correlation: 0.987 M2 Phase RMSE: 4.2 deg Bias: 1.1 deg When --append-stats is used, each call adds a new section labelled with --dataset-name, making it easy to compare multiple atlases or gauge datasets in one file.\nHugo reporting Running regenerate_hugo.py --apply after a tidal run creates/updates the Hugo page at content/validations/\u0026lt;area\u0026gt;-\u0026lt;source\u0026gt;-\u0026lt;experiment\u0026gt;.md (with / and _ in the label flattened to -, e.g. nse-cmems-tidal.md), including the GESLA station comparison table. See the reporting guide and the Hugo deployment guide.\nPerformance The spatial mode runs utide.solve() at every model grid point. For large domains this is the bottleneck. Use --workers N to parallelise across grid rows (default: all available CPUs). A typical North Sea grid (200×300 points) with 8 years of hourly output takes 5–15 minutes depending on the number of constituents.\nThe GESLA mode only analyses at gauge locations (~a few hundred) and is much faster.\n","permalink":"https://bolding-bruggeman.com/oceanicu_3d/guides/tidal-analysis/","summary":"\u003ch1 id=\"tidal-analysis-guide\"\u003eTidal Analysis Guide\u003c/h1\u003e\n\u003ch2 id=\"overview\"\u003eOverview\u003c/h2\u003e\n\u003cp\u003e\u003ccode\u003etidal-analysis\u003c/code\u003e extracts tidal harmonic constituents from model output and\nvalidates them against satellite tidal atlases (FES2014, TPXO9) or tide gauge\nrecords from the GESLA database.\u003c/p\u003e\n\u003cp\u003eThe harmonic analysis uses \u003ccode\u003eutide\u003c/code\u003e to fit sinusoidal components at each grid\npoint or station location.  Model amplitudes and phases are then compared to the\nreference atlas or gauge data.\u003c/p\u003e\n\u003ch2 id=\"analysis-modes\"\u003eAnalysis modes\u003c/h2\u003e\n\u003ctable\u003e\n  \u003cthead\u003e\n      \u003ctr\u003e\n          \u003cth\u003eMode\u003c/th\u003e\n          \u003cth\u003eFlag\u003c/th\u003e\n          \u003cth\u003eDescription\u003c/th\u003e\n      \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003egesla\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003e\u003ccode\u003e--mode gesla\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003eHarmonic analysis at GESLA tide gauge locations (fast; recommended; config default)\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003espatial\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003e\u003ccode\u003e--mode spatial\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003eHarmonic analysis on the full model grid, compared to a tidal atlas\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003eboth\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003e\u003ccode\u003e--mode both\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003eRun spatial and GESLA together\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003estations\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003e\u003ccode\u003e--mode stations\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003eNamed stations listed under \u003ccode\u003estations:\u003c/code\u003e in config\u003c/td\u003e\n      \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch2 id=\"model-source---source----experiment\"\u003eModel source: \u003ccode\u003e--source\u003c/code\u003e / \u003ccode\u003e--experiment\u003c/code\u003e\u003c/h2\u003e\n\u003cp\u003eThe model file to read no longer lives in the per-run config. It comes from\n\u003ca href=\"https://github.com/bolding/ocean-post/blob/main/config/sources.yaml\"\u003econfig/sources.yaml\u003c/a\u003e,\nkeyed by \u003ccode\u003e--source\u003c/code\u003e, with \u003ccode\u003e--experiment\u003c/code\u003e naming the run folder under that\nsource:\u003c/p\u003e","title":"Tidal Analysis"},{"content":"Gridded 2D Validation Guide Overview gridded-2d-validation compares any horizontal 2-D model field against a gridded observation product. Three layer modes are supported:\nLayer Description Typical use surface 2-D field or top of 3-D output SST, SSS, SSH bottom Deepest wet cell of 3-D output Bottom temperature / salinity \u0026lt;depth_m\u0026gt; Horizontal slice at a fixed depth (m) Depth-layer climatology Multiple layers can be run in a single invocation.\nThere are four shipped configs: gridded_2d_validation.yaml is the generic one, with any combination of layers via --layers. gridded_2d_validation_surface.yaml, _bottom.yaml and _depths.yaml are the dedicated single-purpose variants used for NSe.\nPrerequisites Model NetCDF output accessible via config/sources.yaml (see below), or directly via model.base_path / model.filename_pattern A gridded observation file (local or Copernicus Marine / WOA) pip install -e . with the ocean-post package Recommended observation sources Variable Source CMEMS product ID SST OSTIA (CMEMS) METOFFICE-GLO-SST-L4-REP-OBS-SST (analysed_sst) Bottom temperature NW Shelf reanalysis cmems_mod_nws_phy-bottomt_my_7km-2D_P1M-m Bottom salinity NW Shelf reanalysis cmems_mod_nws_phy-so_my_7km-3D_P1M-m Depth-level T/S WOA23 local file, NOAA/NCEI OSTIA SST is delivered in Kelvin — add offset: -273.15 in the obs config block.\nModel source: --source / --experiment / --model / --scenario Model input is NSe\u0026rsquo;s surf_bott_daily.nc (surface: temp_0/salt_0, bottom and depth slices: temp/salt), located via config/sources.yaml:\n# Surface, CMEMS run gridded-2d-validation --config config/gridded_2d_validation_surface.yaml --source CMEMS --experiment run01 --years 2010 2011 # Bottom, WOA run gridded-2d-validation --config config/gridded_2d_validation_bottom.yaml --source WOA --experiment run01 --years 2010 2011 # Surface, CMIP6_raw run — forcing WITHOUT bias correction (e.g. ssp126) gridded-2d-validation --config config/gridded_2d_validation_surface.yaml --source CMIP6_raw --model GFDL-ESM4 --scenario ssp126 --experiment run01 --years 2010 2011 CMIP6 is bias-corrected forcing; CMIP6_raw is not — use CMIP6_raw for raw-forcing runs such as ssp126; --source CMIP6 points at a folder that does not exist for that model/scenario.\n--experiment is the run folder name, and the output label becomes \u0026lt;SOURCE\u0026gt;/\u0026lt;experiment\u0026gt;, or \u0026lt;SOURCE\u0026gt;/\u0026lt;model\u0026gt;-\u0026lt;scenario\u0026gt;/\u0026lt;experiment\u0026gt; for CMIP6/CMIP6_raw.\nConfig file (generic, multi-layer) # config/gridded_2d_validation.yaml area: NS experiment: Baseline # overridden by --experiment when --source is used years: [2010, 2011, 2012] model: # Location, layout and variable names come from config/sources.yaml # (use --source). See the section above. name: \u0026#34;pyGETM\u0026#34; filename_pattern: \u0026#34;surf_bott_daily.nc\u0026#34; layout: explicit_file subdir: CMEMS: \u0026#34;{experiment}\u0026#34; WOA: \u0026#34;{experiment}\u0026#34; CMIP6: \u0026#34;{model}/{scenario}/{experiment}\u0026#34; CMIP6_raw: \u0026#34;{model}/{scenario}/{experiment}\u0026#34; run_model: GFDL-ESM4 # CMIP6 / CMIP6_raw run: overridden by --model run_scenario: ssp126 # CMIP6 / CMIP6_raw run: overridden by --scenario time_offset_days: -1 variable_map: temp: sst # rename model variable if needed variables: [temp] observations: temp: - name: OSTIA path: source: copernicus dataset_id: METOFFICE-GLO-SST-L4-REP-OBS-SST variable: analysed_sst offset: -273.15 processing: layer: surface # single layer (default) # layers: [surface, bottom, 50] # or multiple — CLI: --layers surface bottom 50 chunking: time_chunk: 30 # days per processing chunk output: analyses_dir: \u0026#34;${OCEANICU_ANALYSES_FOLDER}\u0026#34; # no default — see below output.analyses_dir has no default There is no ./analyses fallback. The value is expanded from OCEANICU_ANALYSES_FOLDER in this machine\u0026rsquo;s data-roots file (\u0026lt;hostname\u0026gt;_ocean-post_data_roots.yaml), or set directly with --analyses-dir. If neither is set, the run stops with an error naming the missing variable.\nUsage # Surface only (config default) gridded-2d-validation --config config/gridded_2d_validation_surface.yaml --source CMEMS --experiment run01 --years 2010 2011 # Surface + bottom in one run (generic config) gridded-2d-validation --config config/gridded_2d_validation.yaml --source CMEMS --experiment run01 \\ --layers surface bottom # Surface + 50 m depth slice + bottom gridded-2d-validation --config config/gridded_2d_validation.yaml --source CMEMS --experiment run01 \\ --layers surface 50 bottom The --layers flag overrides processing.layer/processing.layers in the config.\nOutput Results are written to \u0026lt;OCEANICU_ANALYSES_FOLDER\u0026gt;/areas/\u0026lt;area\u0026gt;/validations/\u0026lt;SOURCE\u0026gt;/\u0026lt;experiment\u0026gt;/ (or .../\u0026lt;SOURCE\u0026gt;/\u0026lt;model\u0026gt;-\u0026lt;scenario\u0026gt;/\u0026lt;experiment\u0026gt;/ for CMIP6/CMIP6_raw):\nplots/physics/pyGETM/\u0026lt;period\u0026gt;/ surface/ ← time-mean maps, monthly bias maps, scatter plots bottom/ 50m/ tables/physics/pyGETM/ \u0026lt;variable\u0026gt;_validation_statistics.txt Statistics text files contain overall + monthly RMSE, bias, MAE, and correlation.\nGenerating residuals for MLE comparison gridded-2d-validation can write matched obs/model pairs as a parquet file for use with mle-comparison. One file is written per layer:\n\u0026lt;OCEANICU_ANALYSES_FOLDER\u0026gt;/areas/\u0026lt;area\u0026gt;/validations/\u0026lt;SOURCE\u0026gt;/\u0026lt;experiment\u0026gt;/surface_residuals.parquet \u0026lt;OCEANICU_ANALYSES_FOLDER\u0026gt;/areas/\u0026lt;area\u0026gt;/validations/\u0026lt;SOURCE\u0026gt;/\u0026lt;experiment\u0026gt;/bottom_residuals.parquet \u0026lt;OCEANICU_ANALYSES_FOLDER\u0026gt;/areas/\u0026lt;area\u0026gt;/validations/\u0026lt;SOURCE\u0026gt;/\u0026lt;experiment\u0026gt;/0050m_residuals.parquet Enable in the config (disabled by default to avoid large files):\noutput: save_residuals: true spatial_thinning: stride: 5 # keep every 5th grid point in both lat and lon time_stride: 1 # keep every N-th time step (1 = all) max_rows: 100000 # hard cap per parquet; excess rows are randomly sampled The parquet schema is identical to profile residuals (time, lat, lon, depth, value, model_value, variable) so mle-comparison accepts it directly:\n# Compare experiments using gridded surface obs mle-comparison --analyses-dir $OCEANICU_ANALYSES_FOLDER --area NS \\ --obs-types surface --variables TEMP PSAL # Combine gridded surface obs with Argo profiles mle-comparison --analyses-dir $OCEANICU_ANALYSES_FOLDER --area NS \\ --obs-types surface argo --variables TEMP PSAL Thinning is important. A 0.1° North Sea grid with daily SST obs has millions of rows, almost all spatially correlated. Without thinning the MLE independence assumption is badly violated. Start with stride: 5 and max_rows: 100000; tune until Δlog L values are stable across stride choices. See the Scope section of guides/mle-comparison.md for a full discussion.\nNotes Observations are regridded onto the model grid using bilinear interpolation (xESMF); weight files are cached by MD5 hash under regrid_weights/. For bottom layer: the deepest non-NaN cell is selected per column using sigma-coordinate-aware extraction. For depth slices: the model field is interpolated vertically to the requested depth before regridding. ","permalink":"https://bolding-bruggeman.com/oceanicu_3d/guides/gridded-2d-validation/","summary":"\u003ch1 id=\"gridded-2d-validation-guide\"\u003eGridded 2D Validation Guide\u003c/h1\u003e\n\u003ch2 id=\"overview\"\u003eOverview\u003c/h2\u003e\n\u003cp\u003e\u003ccode\u003egridded-2d-validation\u003c/code\u003e compares any horizontal 2-D model field against a\ngridded observation product.  Three layer modes are supported:\u003c/p\u003e\n\u003ctable\u003e\n  \u003cthead\u003e\n      \u003ctr\u003e\n          \u003cth\u003eLayer\u003c/th\u003e\n          \u003cth\u003eDescription\u003c/th\u003e\n          \u003cth\u003eTypical use\u003c/th\u003e\n      \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003esurface\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003e2-D field or top of 3-D output\u003c/td\u003e\n          \u003ctd\u003eSST, SSS, SSH\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003ebottom\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003eDeepest wet cell of 3-D output\u003c/td\u003e\n          \u003ctd\u003eBottom temperature / salinity\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003e\u0026lt;depth_m\u0026gt;\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003eHorizontal slice at a fixed depth (m)\u003c/td\u003e\n          \u003ctd\u003eDepth-layer climatology\u003c/td\u003e\n      \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003eMultiple layers can be run in a single invocation.\u003c/p\u003e\n\u003cp\u003eThere are four shipped configs:\n\u003ca href=\"https://github.com/bolding/ocean-post/blob/main/config/gridded_2d_validation.yaml\"\u003e\u003ccode\u003egridded_2d_validation.yaml\u003c/code\u003e\u003c/a\u003e\nis the generic one, with any combination of layers via \u003ccode\u003e--layers\u003c/code\u003e.\n\u003ca href=\"https://github.com/bolding/ocean-post/blob/main/config/gridded_2d_validation_surface.yaml\"\u003e\u003ccode\u003egridded_2d_validation_surface.yaml\u003c/code\u003e\u003c/a\u003e,\n\u003ccode\u003e_bottom.yaml\u003c/code\u003e and \u003ccode\u003e_depths.yaml\u003c/code\u003e are the dedicated single-purpose variants\nused for NSe.\u003c/p\u003e","title":"Gridded 2D Validation"},{"content":"Gridded 3D Validation Guide Overview gridded-3d-validation validates model temperature and salinity (or any 3-D variable) against a gridded observation product — WOA23 climatology, CMIP6 ensembles, Copernicus reanalysis, or any dataset that provides values at every horizontal grid point and a set of depth levels.\nThe observations are regridded onto the model grid and compared cell-by-cell, enabling:\nSpatial statistics maps (RMSE, bias, MAE, correlation per grid point) Time-mean comparison maps at selected depth levels Monthly statistics bar charts Statistics text file (overall + monthly breakdown) When to use this tool vs profile validation: Use gridded-3d-validation for climatologies or reanalyses that cover the full model domain at all depths. Use argo-profiles, cruise-ctd-profiles, or fixed-platform for sparse in-situ observations scattered in space and time.\nPrerequisites Model NetCDF output accessible via config/sources.yaml (see below), or directly via model.base_path / model.filename_pattern A gridded 3-D observation product (WOA23, CMEMS reanalysis, CMIP6) pip install -e . with the ocean-post package Recommended observation sources Variable Source Notes Temperature, salinity WOA23 (NOAA/NCEI) climatology, WOA_FOLDER Temperature, salinity GLORYS12 (CMEMS) cmems_mod_glo_phy_my_0.083deg_P1M-m Temperature, salinity CMIP6 ensemble Via PANGEO catalog (cmip6://) Model source: --source / --experiment / --model / --scenario Model input comes from config/sources.yaml, selected with --source. Each run writes one file, nse_3d.nc, in its own run folder, so model.layout is explicit_file and model.subdir maps each source name to that folder:\n# CMEMS run gridded-3d-validation --config config/gridded_3d_validation.yaml --source CMEMS --experiment run01 --years 2010 2011 # WOA run gridded-3d-validation --config config/gridded_3d_validation.yaml --source WOA --experiment run01 --years 2010 2011 # CMIP6_raw run — forcing WITHOUT bias correction (e.g. ssp126) gridded-3d-validation --config config/gridded_3d_validation.yaml --source CMIP6_raw --model GFDL-ESM4 --scenario ssp126 --experiment run01 --years 2010 2011 CMIP6 is bias-corrected forcing; CMIP6_raw is not. Use whichever actually matches the run — do not use --source CMIP6 for a run that was forced with the raw (non-bias-corrected) data, since the input folder for that model/scenario combination will not exist under CMIP6.\n--experiment is the run folder name (e.g. run01), and the output label becomes \u0026lt;SOURCE\u0026gt;/\u0026lt;experiment\u0026gt;, or \u0026lt;SOURCE\u0026gt;/\u0026lt;model\u0026gt;-\u0026lt;scenario\u0026gt;/\u0026lt;experiment\u0026gt; for CMIP6/CMIP6_raw.\nConfig file # config/gridded_3d_validation.yaml area: \u0026#34;NS\u0026#34; experiment: \u0026#34;Baseline\u0026#34; # overridden by --experiment when --source is used year: 2021 # years: [2020, 2022] variables: [temp, salt] observations: temp: WOA: \u0026#34;${WOA_FOLDER}/woa_t.nc\u0026#34; salt: WOA: \u0026#34;${WOA_FOLDER}/woa_s.nc\u0026#34; model: # Location, layout and variable names come from config/sources.yaml # (use --source CMEMS|WOA|CMIP6|CMIP6_raw). See the section above. name: \u0026#34;pyGETM\u0026#34; filename_pattern: \u0026#34;nse_3d.nc\u0026#34; run_model: GFDL-ESM4 # CMIP6 / CMIP6_raw run: overridden by --model run_scenario: ssp126 # CMIP6 / CMIP6_raw run: overridden by --scenario layout: explicit_file subdir: CMEMS: \u0026#34;{experiment}\u0026#34; WOA: \u0026#34;{experiment}\u0026#34; CMIP6: \u0026#34;{model}/{scenario}/{experiment}\u0026#34; CMIP6_raw: \u0026#34;{model}/{scenario}/{experiment}\u0026#34; processing: depth_levels: [5, 50, 100, 200, 500] # depth slices to compare compute_spatial_stats: true subsetting: type: none # none | bbox | polygon — restrict to a sub-region (optional) output: analyses_dir: \u0026#34;${OCEANICU_ANALYSES_FOLDER}\u0026#34; # no default — see below Config file on GitHub: config/gridded_3d_validation.yaml\noutput.analyses_dir has no default There is no ./analyses fallback. The value is expanded from OCEANICU_ANALYSES_FOLDER in this machine\u0026rsquo;s data-roots file (\u0026lt;hostname\u0026gt;_ocean-post_data_roots.yaml), or set directly with --analyses-dir. If neither is set, the run stops with an error naming the missing variable.\nUsage # Run with config file and --source gridded-3d-validation --config config/gridded_3d_validation.yaml --source CMEMS --experiment run01 --years 2010 2011 --workers 16 # Override depth levels on the command line gridded-3d-validation --config config/gridded_3d_validation.yaml --source CMEMS --experiment run01 \\ --depths 5 50 100 200 Output Results are written to \u0026lt;OCEANICU_ANALYSES_FOLDER\u0026gt;/areas/\u0026lt;area\u0026gt;/validations/\u0026lt;SOURCE\u0026gt;/\u0026lt;experiment\u0026gt;/ (or .../\u0026lt;SOURCE\u0026gt;/\u0026lt;model\u0026gt;-\u0026lt;scenario\u0026gt;/\u0026lt;experiment\u0026gt;/ for CMIP6/CMIP6_raw):\nplots/physics/pyGETM/\u0026lt;period\u0026gt;/ 3d/ \u0026lt;variable\u0026gt;_bias_\u0026lt;depth\u0026gt;m.png \u0026lt;variable\u0026gt;_rmse_\u0026lt;depth\u0026gt;m.png \u0026lt;variable\u0026gt;_monthly_stats.png tables/physics/pyGETM/ \u0026lt;variable\u0026gt;_validation_statistics.txt Statistics text files contain overall RMSE, bias, MAE, and correlation plus a monthly breakdown.\nGenerating residuals for MLE comparison gridded-3d-validation can write matched obs/model pairs as a parquet file for use with mle-comparison. All variables are combined into a single file:\n\u0026lt;OCEANICU_ANALYSES_FOLDER\u0026gt;/areas/\u0026lt;area\u0026gt;/validations/\u0026lt;SOURCE\u0026gt;/\u0026lt;experiment\u0026gt;/gridded3d_residuals.parquet Enable in the config (disabled by default to avoid large files):\noutput: save_residuals: true spatial_thinning: stride: 5 # keep every 5th grid point in both lat and lon z_stride: 2 # keep every N-th depth level time_stride: 1 # keep every N-th time step (1 = all; 12 for monthly clim) max_rows: 100000 # hard cap per parquet; excess rows are randomly sampled The parquet schema is identical to profile residuals (time, lat, lon, depth, value, model_value, variable), with depth holding the actual depth coordinate value for each level.\n# Compare experiments using gridded 3D obs mle-comparison --analyses-dir $OCEANICU_ANALYSES_FOLDER --area NS \\ --obs-types gridded3d --variables TEMP PSAL # Combine gridded 3D obs with Argo profiles for fuller vertical coverage mle-comparison --analyses-dir $OCEANICU_ANALYSES_FOLDER --area NS \\ --obs-types gridded3d argo --variables TEMP PSAL Thinning is important. A 1° WOA grid with 20 depth levels gives ~500,000 cells for a typical regional domain; neighbouring levels and grid points are strongly correlated. Use stride and z_stride to reduce this. See the Scope section of guides/mle-comparison.md for a full discussion.\nNotes Observations are interpolated horizontally onto the model grid (xESMF bilinear); weight files are cached by MD5 hash under regrid_weights/. Observations are then interpolated vertically onto each depth_levels target using linear interpolation. If the obs product is a 12-month climatology (no explicit year axis), each model time step is matched to the corresponding calendar month. ","permalink":"https://bolding-bruggeman.com/oceanicu_3d/guides/gridded-3d-validation/","summary":"\u003ch1 id=\"gridded-3d-validation-guide\"\u003eGridded 3D Validation Guide\u003c/h1\u003e\n\u003ch2 id=\"overview\"\u003eOverview\u003c/h2\u003e\n\u003cp\u003e\u003ccode\u003egridded-3d-validation\u003c/code\u003e validates model temperature and salinity (or any\n3-D variable) against a \u003cstrong\u003egridded observation product\u003c/strong\u003e — WOA23 climatology,\nCMIP6 ensembles, Copernicus reanalysis, or any dataset that provides values\nat every horizontal grid point and a set of depth levels.\u003c/p\u003e\n\u003cp\u003eThe observations are regridded onto the model grid and compared cell-by-cell,\nenabling:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eSpatial statistics maps (RMSE, bias, MAE, correlation per grid point)\u003c/li\u003e\n\u003cli\u003eTime-mean comparison maps at selected depth levels\u003c/li\u003e\n\u003cli\u003eMonthly statistics bar charts\u003c/li\u003e\n\u003cli\u003eStatistics text file (overall + monthly breakdown)\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eWhen to use this tool vs profile validation:\u003c/strong\u003e\nUse \u003ccode\u003egridded-3d-validation\u003c/code\u003e for climatologies or reanalyses that cover the\nfull model domain at all depths.  Use \u003ccode\u003eargo-profiles\u003c/code\u003e, \u003ccode\u003ecruise-ctd-profiles\u003c/code\u003e,\nor \u003ccode\u003efixed-platform\u003c/code\u003e for sparse in-situ observations scattered in space and\ntime.\u003c/p\u003e","title":"Gridded 3D Validation"},{"content":"Profile Validation Guide Overview Five scripts share the same profile validation workflow:\nCommand Observation source argo-profiles Argo floats (Ifremer ERDDAP) glodap-profiles GLODAP v2.2023 bottle data wod-profiles World Ocean Database (NOAA ERDDAP) cruise-ctd-profiles ICES / EMODnet cruise CTD casts ices-profiles ICES/ECOVAL profiles (local Feather files) fixed-platform EMODnet fixed-platform (mooring/buoy) profiles All six follow the same config structure, output layout, and command-line flags.\nConfig structure Annotated example configs: config/argo_profiles.yaml · config/glodap_profiles.yaml · config/cruise_ctd_profiles.yaml · config/wod_profiles.yaml · config/ices_profiles.yaml · config/fixed_platform.yaml\n# config/argo_profiles.yaml (per-run) area: NA experiment: Baseline # overridden by --experiment when --source is used years: [2020, 2022] # or year: 2021 for a single year domain: lon_min: -20.0 lon_max: 10.0 lat_min: 40.0 lat_max: 65.0 variables: [TEMP, PSAL, DOXY] # subset of available variables argo: dataset: realtime wmo_numbers: [] # leave empty to download all floats in domain cache_dir: \u0026#34;${CACHE_ROOT}/argo\u0026#34; model: # Location, layout and variable names come from config/sources.yaml # (use --source). See the section below. Remove the model block entirely # for obs-only diagnostics. name: \u0026#34;pyGETM\u0026#34; filename_pattern: \u0026#34;nse_3d.nc\u0026#34; layout: explicit_file subdir: CMEMS: \u0026#34;{experiment}\u0026#34; WOA: \u0026#34;{experiment}\u0026#34; CMIP6: \u0026#34;{model}/{scenario}/{experiment}\u0026#34; CMIP6_raw: \u0026#34;{model}/{scenario}/{experiment}\u0026#34; run_model: GFDL-ESM4 # CMIP6 / CMIP6_raw run: overridden by --model run_scenario: ssp126 # CMIP6 / CMIP6_raw run: overridden by --scenario variable_map: TEMP: temp PSAL: salt DOXY: doxy output: analyses_dir: \u0026#34;${OCEANICU_ANALYSES_FOLDER}\u0026#34; # no default — see below save_residuals: true # default on; set false to disable prefix: \u0026#34;na_argo\u0026#34; # stem for overview figure filenames Required keys: area, experiment, and (only without --source) model.base_path, model.filename_pattern.\nModel source: --source / --experiment / --model / --scenario Model input comes from config/sources.yaml, selected with --source — the same mechanism as tidal and gridded validation:\nargo-profiles --config config/argo_profiles.yaml --source CMEMS --experiment run01 --years 2020 2022 # CMIP6_raw run — forcing WITHOUT bias correction (e.g. ssp126) argo-profiles --config config/argo_profiles.yaml --source CMIP6_raw --model GFDL-ESM4 --scenario ssp126 --experiment run01 --years 2020 2022 CMIP6 is bias-corrected forcing; CMIP6_raw is not — use CMIP6_raw for raw-forcing runs. --experiment is the run folder name, and the output label becomes \u0026lt;SOURCE\u0026gt;/\u0026lt;experiment\u0026gt;, or \u0026lt;SOURCE\u0026gt;/\u0026lt;model\u0026gt;-\u0026lt;scenario\u0026gt;/\u0026lt;experiment\u0026gt; for CMIP6/CMIP6_raw.\noutput.analyses_dir has no default There is no ./analyses fallback. The value is expanded from OCEANICU_ANALYSES_FOLDER in this machine\u0026rsquo;s data-roots file (\u0026lt;hostname\u0026gt;_ocean-post_data_roots.yaml), or set directly with --analyses-dir. If neither is set, the run stops with an error naming the missing variable.\nCommon command-line flags All six scripts accept:\nFlag Description --config FILE YAML config file --area NAME Override area --experiment NAME Override experiment (the run folder when --source is used) --source NAME Model source from config/sources.yaml (e.g. CMEMS, WOA, CMIP6, CMIP6_raw) --model NAME / --scenario NAME CMIP6/CMIP6_raw model and scenario --years START END Override year range --variables VAR … Override variables --analyses-dir DIR Override output.analyses_dir (otherwise required via OCEANICU_ANALYSES_FOLDER) --no-staging Skip writing to simulation registry --dryrun Print configuration summary and exit without running Script-specific flags:\nargo-profiles, wod-profiles, cruise-ctd-profiles: no extra flags glodap-profiles, ices-profiles: --no-model (skip model comparison, obs diagnostics only) fixed-platform: --list-platforms (survey mode), --platform INDEX_OR_LAT,LON, --min-obs N What each run produces \u0026lt;OCEANICU_ANALYSES_FOLDER\u0026gt;/areas/\u0026lt;AREA\u0026gt;/validations/\u0026lt;SOURCE\u0026gt;/\u0026lt;experiment\u0026gt;/ ├── plots/ │ └── physics/ ← physics | bio │ └── pyGETM/ │ └── \u0026lt;period\u0026gt;/ ← e.g. 2020-2022 │ └── argo/ ← or glodap/, wod/, cruise/, ices/, platform/ │ ├── \u0026lt;prefix\u0026gt;_overview.png │ ├── \u0026lt;prefix\u0026gt;_hovmoller_TEMP.png │ └── \u0026lt;prefix\u0026gt;_profiles_YYYY.png └── tables/ └── physics/ └── pyGETM/ └── argo/ └── \u0026lt;prefix\u0026gt;_profile_validation_statistics.txt For CMIP6/CMIP6_raw, the path is .../\u0026lt;SOURCE\u0026gt;/\u0026lt;model\u0026gt;-\u0026lt;scenario\u0026gt;/\u0026lt;experiment\u0026gt;/....\nThe overview figure typically has 6 panels:\nfloat/station/cruise map coloured by platform or time temperature vs depth scatter salinity vs depth scatter T-S diagram mean vertical profiles (normalised) profile or observation count per platform Running multiple experiments Run the script once per experiment/run folder:\nargo-profiles --config config/argo_profiles.yaml --source CMEMS --experiment run01 argo-profiles --config config/argo_profiles.yaml --source WOA --experiment run01 argo-profiles --config config/argo_profiles.yaml --source CMIP6_raw --model GFDL-ESM4 --scenario ssp126 --experiment run01 Generating residuals for MLE comparison save_residuals is enabled by default (true). Each run writes a parquet file alongside the standard validation outputs:\n\u0026lt;OCEANICU_ANALYSES_FOLDER\u0026gt;/areas/\u0026lt;AREA\u0026gt;/validations/\u0026lt;SOURCE\u0026gt;/\u0026lt;experiment\u0026gt;/argo_residuals.parquet The parquet has columns: time, lat, lon, depth, variable, value (obs), model_value, and optionally profile_id.\nTo disable:\noutput: save_residuals: false Vertical thinning to reduce autocorrelation Adjacent depth levels in a profile are strongly correlated, which violates the MLE independence assumption. Use vertical_thinning to thin before writing the parquet:\noutput: save_residuals: true vertical_thinning: method: min_spacing # none (default) | min_spacing | stride spacing_m: 25.0 # for min_spacing: min metres between kept levels # stride: 3 # for stride: keep every N-th depth level min_spacing — greedy algorithm: walk depths sorted ascending and keep a level only when it is ≥ spacing_m below the last kept level. Handles irregular Argo/ICES spacing naturally; recommended for most use cases. stride — keep every N-th unique depth within each profile. Faster but assumes levels are roughly evenly spaced. Thinning is applied per-cast (all variables in the same cast get the same depth levels selected), so TEMP and PSAL remain matched.\nSee guides/mle-comparison.md for the ranking workflow.\nGLODAP-specific notes The GLODAP v2.2023 merged master file (~300 MB) is downloaded automatically on first run and cached locally. Set glodap.cache_dir in the config to control where it lands:\nglodap: cache_dir: \u0026#34;${CACHE_ROOT}/glodap\u0026#34; qc_flags: [2] # 2 = good data; 0 includes unqualified Pass --no-model to produce observation-only diagnostics (station map, T-S diagram, profile climatology) without loading any model output.\nICES feather-file notes ices-profiles reads pre-exported ICES/ECOVAL quality-controlled profiles from local Apache Arrow Feather files, under observations.data_dir (e.g. ${ECOVAL_FOLDER}/point/nws/all):\n\u0026lt;observations.data_dir\u0026gt;/ ├── temperature/ │ └── *_temperature_\u0026lt;year\u0026gt;.feather ├── salinity/ │ └── *_salinity_\u0026lt;year\u0026gt;.feather └── … Unlike the ERDDAP-based scripts, no network access is required — data must be exported from the ICES Oceanographic Database (or ECOVAL) in advance.\nPass --no-model to produce observation-only diagnostics.\nFixed-platform notes fixed-platform reads EMODnet Chemistry fixed-platform (mooring/buoy) vertical profiles via ERDDAP. Unlike scattered cruise CTD casts, a platform collects repeated profiles at the same position over time, so the output includes Hovmoller diagrams (time × depth), fixed-depth time series, and seasonal depth structure.\nBecause a domain can contain many platforms, the workflow is a two-step survey-then-analyse:\n# Step 1 — survey: list all platforms in the domain, no heavy analysis fixed-platform --config config/fixed_platform.yaml --list-platforms # Step 2 — analyse: pick a platform by rank from the inventory table... fixed-platform --config config/fixed_platform.yaml --platform 3 # ...or by coordinates fixed-platform --config config/fixed_platform.yaml --platform 51.3,2.9 --min-obs N pre-filters platform clusters with fewer than N observations before ranking.\n","permalink":"https://bolding-bruggeman.com/oceanicu_3d/guides/profile-validation/","summary":"\u003ch1 id=\"profile-validation-guide\"\u003eProfile Validation Guide\u003c/h1\u003e\n\u003ch2 id=\"overview\"\u003eOverview\u003c/h2\u003e\n\u003cp\u003eFive scripts share the same profile validation workflow:\u003c/p\u003e\n\u003ctable\u003e\n  \u003cthead\u003e\n      \u003ctr\u003e\n          \u003cth\u003eCommand\u003c/th\u003e\n          \u003cth\u003eObservation source\u003c/th\u003e\n      \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003eargo-profiles\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003eArgo floats (Ifremer ERDDAP)\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003eglodap-profiles\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003eGLODAP v2.2023 bottle data\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003ewod-profiles\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003eWorld Ocean Database (NOAA ERDDAP)\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003ecruise-ctd-profiles\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003eICES / EMODnet cruise CTD casts\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003eices-profiles\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003eICES/ECOVAL profiles (local Feather files)\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003efixed-platform\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003eEMODnet fixed-platform (mooring/buoy) profiles\u003c/td\u003e\n      \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003eAll six follow the same config structure, output layout, and command-line flags.\u003c/p\u003e\n\u003ch2 id=\"config-structure\"\u003eConfig structure\u003c/h2\u003e\n\u003cp\u003eAnnotated example configs:\n\u003ca href=\"https://github.com/bolding/ocean-post/blob/main/config/argo_profiles.yaml\"\u003econfig/argo_profiles.yaml\u003c/a\u003e ·\n\u003ca href=\"https://github.com/bolding/ocean-post/blob/main/config/glodap_profiles.yaml\"\u003econfig/glodap_profiles.yaml\u003c/a\u003e ·\n\u003ca href=\"https://github.com/bolding/ocean-post/blob/main/config/cruise_ctd_profiles.yaml\"\u003econfig/cruise_ctd_profiles.yaml\u003c/a\u003e ·\n\u003ca href=\"https://github.com/bolding/ocean-post/blob/main/config/wod_profiles.yaml\"\u003econfig/wod_profiles.yaml\u003c/a\u003e ·\n\u003ca href=\"https://github.com/bolding/ocean-post/blob/main/config/ices_profiles.yaml\"\u003econfig/ices_profiles.yaml\u003c/a\u003e ·\n\u003ca href=\"https://github.com/bolding/ocean-post/blob/main/config/fixed_platform.yaml\"\u003econfig/fixed_platform.yaml\u003c/a\u003e\u003c/p\u003e","title":"Profile Validation"},{"content":"MLE Cross-Experiment Comparison Guide Overview Standard validation metrics (RMSE, bias, correlation) compare each experiment against observations in isolation. When you have three or more experiments that share the same observation dataset — sensitivity runs, ensemble members, or physics variants — a scalar metric gives no information about the joint structure of the errors.\nMLE comparison in reduced-rank (SVD) space addresses this. The joint residual matrix across all experiments is decomposed with SVD, and each experiment is ranked by its Gaussian log-likelihood in the leading modes. This is the same \u0026ldquo;optimal fingerprinting\u0026rdquo; framework used in climate attribution (Allen \u0026amp; Tett 1999): the leading SVD modes capture the dominant joint variance pattern, and the log-likelihood in that low-dimensional space is a principled, multi-dimensional distance from perfect.\nThe result is a ranking table where the best experiment has Δlog L = 0 and all others have Δlog L \u0026lt; 0. A large negative Δlog L means that experiment\u0026rsquo;s residual pattern is substantially different from the best, in the directions that matter most across the ensemble.\nWhy SVD? The residual matrix R has shape n_obs × n_exp (often 100 000 × 8). A naive multivariate Gaussian log-likelihood in the full n_obs-dimensional space is intractable for two reasons:\nThe covariance matrix cannot be inverted. With only n_exp columns, the sample covariance of R has rank at most n_exp, far smaller than n_obs. The inverse does not exist and the Gaussian likelihood is undefined.\nThe column space of R is at most n_exp-dimensional. No matter how many observations there are, experiments can only differ along at most n_exp independent directions. Anything outside that subspace is shared error and contributes nothing to the ranking.\nSVD solves both problems by working exclusively in the low-dimensional subspace spanned by the experiment columns. The decomposition R_std = U diag(s) Vᵀ reveals that subspace via the left singular vectors U. Keeping the r leading modes (by the variance threshold) retains the directions of maximum joint variance — the directions where experiments most clearly differ — and discards the noise-dominated tail.\nWithin this r-dimensional space the Gaussian log-likelihood is well-posed: there are at most n_exp − 1 non-trivial modes, r is small, and the remaining variance (the discarded tail) is absorbed into the σ² estimate. The result is a principled, noise-regularised distance from perfect that is comparable across experiments regardless of how many observations exist.\nA secondary benefit is numerical: the SVD of an n_obs × n_exp matrix costs O(n_obs × n_exp²), which is fast even for large observation datasets because n_exp is always small (see Computational cost).\nWhen to use this You have three or more experiments with different physics, forcing, or grid settings. All experiments were evaluated against the same observation dataset (e.g. Argo floats or GLODAP profiles). The experiments cover overlapping time periods and geographic domains. It is less useful when:\nYou only have two experiments — the result collapses to a weighted RMSE comparison and provides no additional information. Experiments cover non-overlapping years — the common observation footprint will be empty or too small. How it works experiment DataFrames (time, lat, lon, depth, value, model_value, variable) │ ▼ 1. Common footprint Intersect observation keys present in ALL experiments with non-NaN obs and model values. │ ▼ 2. Residual matrix R [n_obs × n_exp] R[i, k] = model_value[i,k] − obs_value[i] │ ▼ 3. Standardise per variable Divide each variable\u0026#39;s rows by the obs standard deviation so TEMP, PSAL, and DOXY are commensurable. │ ▼ 4. SVD → R_std ≈ U · diag(s) · Vt Select leading r modes by cumulative variance threshold (default 90%). │ ▼ 5. Project each experiment: r̃_k = U_r^T · R_std[:, k] shape (r,) │ ▼ 6. Log-likelihood: log L_k = −½ σ⁻² ‖r̃_k‖² Rank by Δlog L = log L_k − max(log L) │ ▼ 7. Additive breakdown (diagnostics only) For each group g (variable or obs type), rows are disjoint so: r̃_k = Σ_g U_r[g_mask]ᵀ R_std[g_mask, k] (exact) Per-group log-likelihood contribution: log L_{k,g} = −½ σ⁻² r̃_{k,g}ᵀ r̃_k Σ_g log L_{k,g} = log L_k (exact, no cross-term correction needed) Prerequisites Each experiment must first produce a residuals parquet file. The path and filename depend on the analysis type:\nAnalysis Config key Parquet written argo-profiles output.save_residuals: true (default on) argo_residuals.parquet glodap-profiles same glodap_residuals.parquet ices-profiles same ices_profiles_residuals.parquet cruise-ctd-profiles same cruise_ctd_residuals.parquet fixed-platform same fixed_platform_residuals.parquet gridded-2d-validation output.save_residuals: true (default off) surface_residuals.parquet, bottom_residuals.parquet, etc. gridded-3d-validation output.save_residuals: true (default off) gridded3d_residuals.parquet Run each analysis once per experiment, changing experiment: in the config. All experiments must share the same area: so the observation footprint is comparable.\nCLI usage Step 1: Generate residual files # Profile observations (save_residuals: true is the default) argo-profiles --config config/baseline.yaml argo-profiles --config config/sensitivity1.yaml argo-profiles --config config/sensitivity2.yaml # Gridded surface obs (add save_residuals: true + spatial_thinning to the YAML) gridded-2d-validation --config config/baseline_2d.yaml gridded-2d-validation --config config/sensitivity1_2d.yaml # Gridded 3D obs (same) gridded-3d-validation --config config/baseline_3d.yaml gridded-3d-validation --config config/sensitivity1_3d.yaml Step 2: Run MLE comparison # Auto-discover all experiments with Argo residuals for this area mle-comparison --analyses-dir $OCEANICU_ANALYSES_FOLDER --area NS \\ --obs-types argo --variables TEMP PSAL DOXY --diagnostics # Exclude a specific experiment from auto-discovery mle-comparison --analyses-dir $OCEANICU_ANALYSES_FOLDER --area NS \\ --obs-types argo --exclude-experiments OldRun TestRun # Explicitly name experiments (disables auto-discovery) mle-comparison --analyses-dir $OCEANICU_ANALYSES_FOLDER --area NS \\ --experiments Baseline Sensitivity1 Sensitivity2 \\ --obs-types argo --variables TEMP PSAL DOXY # Combine Argo (deep water) + fixed stations (coastal) for fuller coverage mle-comparison --analyses-dir $OCEANICU_ANALYSES_FOLDER --area NS \\ --obs-types argo fixed_platform --variables TEMP PSAL # Gridded surface obs (e.g. satellite SST, bottom-T reanalysis) mle-comparison --analyses-dir $OCEANICU_ANALYSES_FOLDER --area NS \\ --obs-types surface --variables TEMP # Combine gridded surface obs with Argo for joint surface + profile ranking mle-comparison --analyses-dir $OCEANICU_ANALYSES_FOLDER --area NS \\ --obs-types surface argo --variables TEMP PSAL # Gridded 3D obs (e.g. WOA23 climatology) mle-comparison --analyses-dir $OCEANICU_ANALYSES_FOLDER --area NS \\ --obs-types gridded3d --variables TEMP PSAL # Log-transform phytoplankton and oxygen before ranking mle-comparison --analyses-dir $OCEANICU_ANALYSES_FOLDER --area NS \\ --obs-types argo --variables TEMP PSAL CHLA DOXY \\ --transforms CHLA:log DOXY:log When --experiments is omitted the script scans analyses/areas/\u0026lt;area\u0026gt;/validations/ for every experiment directory that contains \u0026lt;obs_type\u0026gt;_residuals.parquet for all requested obs types. The mle_comparison output directory is always skipped.\nResiduals from all --obs-types are concatenated per experiment before the common footprint is built, so each obs source contributes its locations.\nKey options:\nFlag Default Description --analyses-dir none — effectively required Root of the analyses tree. No ./analyses fallback, and unlike the validation scripts this one does not expand ${VAR} — pass a real path, or a literal path under analyses_dir: in the config (see below). --area required Area code, e.g. NS --experiments auto-discover Two or more experiment names; if omitted, all with residuals are used --exclude-experiments none Experiment names to drop from auto-discovery (ignored when --experiments is set) --obs-types required One or more: argo, glodap, wod, fixed_platform, surface, bottom, gridded3d, … --variables all in data Variable names to include --transforms none Per-variable transform: VAR:TRANSFORM pairs. See below. --rank auto Force SVD rank --variance-threshold 0.90 Cumulative variance for auto rank --sigma2-method pooled One of pooled, median_exp, best_exp --diagnostics off Write scree plot, mode-loading plot, per-mode bar chart --output-dir auto Override output directory for results Variable transforms For biogeochemical variables whose distributions are right-skewed (phytoplankton chlorophyll, nutrients, turbidity), a Gaussian residual assumption is not appropriate in linear space. Applying a log-transform before the MLE makes the residuals approximately Gaussian:\nTransform Applied as Use for log ln(model) − ln(obs) = ln(model/obs) Chlorophyll, POC, nutrients log10 log₁₀(model) − log₁₀(obs) Same; more interpretable magnitudes sqrt √model − √obs Weakly skewed count-like variables none / identity model − obs (default) Temperature, salinity, … Rows where the raw value or model value is ≤ 0 are dropped before the common footprint is built (a warning is logged for each experiment).\nUsing a config file # config/mle_comparison.yaml area: NS analyses_dir: /data/local/analyses # a real path — ${VAR} is NOT expanded here # experiments: [Baseline, Sensitivity1, Sensitivity2] # omit to auto-discover exclude_experiments: [OldRun] # dropped from auto-discovery (ignored if experiments is set) obs_types: [argo, fixed_platform] # list for multi-source, or a single string variables: [TEMP, PSAL, CHLA] transforms: CHLA: log # ln(model/obs) residuals for chlorophyll DOXY: log # ln(model/obs) residuals for dissolved oxygen rank: 3 diagnostics: true mle-comparison --config config/mle_comparison.yaml Command-line flags override config file values.\nOutput Results are written to analyses/areas/\u0026lt;area\u0026gt;/validations/mle_comparison/:\nFile Description mle_ranking.csv Machine-readable ranking table mle_ranking.txt Human-readable ranking summary scree_plot.png Singular values + cumulative explained variance mode_loadings_mode0.png Spatial scatter of top loadings for mode 0 (and mode 1, …) per_mode_contributions.png Per-mode log-likelihood contributions by experiment contributions_by_variable.png Log-likelihood contributions broken down by variable (TEMP, PSAL, …) contributions_by_obs_type.png Log-likelihood contributions broken down by obs source (argo, ices_profiles, …) — only when multiple --obs-types are combined mle_ranking.csv columns:\nColumn Description experiment Experiment name log_likelihood Gaussian log-likelihood in SVD space rank 1 = best delta_log_L log_likelihood − max(log_likelihood); 0 for the best aic Akaike information criterion (−2 log L + 2) explained_variance_captured Fraction of joint variance in the chosen rank Why gridded validation scores may diverge from MLE rankings It is common to see a large improvement in a gridded 3D or surface RMSE score for one experiment while the MLE ranking shows little or no separation. This is not a bug; it reflects a genuine difference in what the two metrics measure.\nGridded validation (e.g. gridded-3d-validation) compares the model to a gridded reference product — a WOA climatological mean, a CMEMS reanalysis, or a satellite analysis. These products are spatially dense (every grid cell has a value) but heavily smoothed and, in the case of reanalyses, data-assimilated. An experiment that is initialised from or constrained by the same data family will naturally score better on that metric. The score also measures bulk domain-mean skill averaged over every grid cell, which can be dominated by a few large regions or seasons.\nMLE ranking uses raw in-situ residuals from ARGO floats or ICES profiles — sparse, independent point measurements at actual ocean interior locations with no data assimilation applied. It asks: does this experiment produce residuals that are collectively closer to Gaussian noise at the places where observations exist? This is a stricter and more independent test.\nThe divergence is therefore informative:\nPattern Interpretation Experiment A wins on gridded RMSE but not on MLE A may be tuned to match a particular gridded reference (or share its bias), but the improvement does not carry over to independent in-situ locations. Experiment A wins on MLE but not on gridded RMSE A may genuinely improve the interior water-mass structure at observation depths, even if the domain-mean surface or climatological score is similar. Both metrics agree The improvement is robust across data sources and spatial scales. Use both metrics together. Neither supersedes the other; they answer different questions about model skill.\nInterpreting results Only delta_log_L matters, not the absolute log-likelihood value. delta_log_L = 0 identifies the best experiment; more negative values indicate larger residuals in the joint SVD space.\nWith two experiments the result is equivalent to a weighted RMSE comparison. The method adds value from three experiments upward.\nAIC (−2 log L + 2) can be used in a model-selection sense: prefer the experiment with the lowest AIC. The + 2 term penalises the single free parameter σ². For the purposes of cross-experiment ranking, AIC and Δlog L give the same ordering.\nScree plot Shows the singular values and their cumulative explained variance. If a single mode dominates, the ranking is essentially one-dimensional and driven by one error pattern. If several modes have similar singular values, the comparison is genuinely multi-dimensional and the mode-loading plots for each mode are all relevant.\nMode-loading plot Each SVD mode has a corresponding left singular vector U of length n_obs. The mode-loading plot maps the top 30 entries by magnitude onto geographic space, where:\nCircle size is proportional to the absolute value of the loading — larger circles are the observation locations that most strongly define this mode and carry the most weight in separating experiments. Circle colour is the signed loading value. Locations with the same colour move together in this mode: when one experiment has a larger residual at a dark-red location, it tends to have larger residuals at all other dark-red locations too. Locations with opposite colours (red vs. blue) are anti-correlated in this mode. Labels show the variable (e.g. PSAL, TEMP) at that location. What to look for:\nAll circles the same colour → mode 0 captures a nearly uniform bias that all experiments share. The ranking reflects which experiment has the smallest overall bias in that direction. A mix of red and blue → the mode captures a spatial contrast (e.g. north–south or coastal–offshore gradient). Experiments that do well in one region but poorly in another will be separated here. Circles concentrated in one sub-region → that geographic area is driving the ranking. Check whether the model resolution or forcing is different there. Example: if the mode-0 map shows all-negative loadings of similar magnitude spread across the domain (as in a uniform salinity bias), mode 0 is telling you that the experiments differ mainly in their domain-wide mean salinity error, not in their spatial pattern. An experiment with a smaller mean salinity bias will have a less-negative log-likelihood contribution in this mode.\nPer-mode contributions bar chart Shows each experiment\u0026rsquo;s log-likelihood contribution broken down by SVD mode. One group of bars per mode (left to right), one bar per experiment per group.\nBar height (all negative) is −½ σ⁻² r̃² for that experiment in that mode: a shorter bar means the residual projected onto this mode is smaller, i.e. better. When only one mode is shown (rank = 1), the total ranking collapses to a single number. All experiments are compared on the same dominant error pattern and their relative bar heights directly mirror the delta_log_L ranking table. When multiple modes are shown, you can see whether an experiment that wins overall does so because it is good across all modes, or because it excels in one mode while being mediocre in others. Example: if seven experiments all show similar bar heights in a single-mode result (bars clustered between −0.3 and −0.5), the experiments are not strongly separated. A large spread (one bar near 0, another near −1) indicates a clear winner. Bars of almost identical height mean the observation dataset does not have enough discriminating power to separate those two experiments — consider adding more obs types or variables.\nContributions by variable / obs type These charts decompose the total log-likelihood into additive per-variable (or per-obs-type) contributions. The decomposition is exact: because the observation rows are partitioned by group, the group projected residuals sum to the total:\nr̃_k = Σ_g U_r[g_mask]ᵀ R_std[g_mask, k] (exact, not approximate) The additive contribution of group g to experiment k\u0026rsquo;s log-likelihood is then −½ σ⁻² r̃_{k,g}ᵀ r̃_k, and summing over groups recovers the total log L_k = −½ σ⁻² ‖r̃_k‖² exactly. The bars therefore stack to the total log-likelihood bar for each experiment.\nBars shorter (less negative) for a group → that variable or obs source is where the experiment performs best relative to the others. One group dominates all experiments equally → the ranking is insensitive to that group; removing it would not change the order. One group separates the experiments → that variable or obs source carries the discriminating power. Cross-check with the mode-loading map to see which geographic region is responsible. Rank selection The default automatic selection combines two criteria:\nVariance threshold: smallest r where cumulative explained variance ≥ variance_threshold (default 0.90). Elbow: the r at the largest second-difference drop in the singular value spectrum. The chosen rank is min(threshold_r, elbow_r), clamped to [1, n_modes − 1].\nOverride with --rank when you have domain knowledge about how many independent error patterns to expect. Too low a rank discards real signal; too high a rank projects onto noise and compresses the ranking. The scree plot is the diagnostic to consult.\nProgrammatic use from lib.mle_comparison import compare_experiments_mle # experiment_dfs: dict of experiment_name -\u0026gt; DataFrame result = compare_experiments_mle( experiment_dfs, variables=[\u0026#39;TEMP\u0026#39;, \u0026#39;PSAL\u0026#39;, \u0026#39;DOXY\u0026#39;], variance_threshold=0.90, return_diagnostics=True, ) ranking_df, diag = result print(ranking_df) # Diagnostics dict keys: # singular_values, explained_variance, chosen_rank, # U_r, Vt_r, r_tilde, sigma2, meta_df, scalings Each DataFrame in experiment_dfs must have columns: time, lat, lon, depth, value, model_value, variable and optionally profile_id.\nScope and the independence assumption The log-likelihood formula assumes independent observations:\nlog L_k = −½ σ⁻² ‖r̃_k‖² This is naturally satisfied for sparse in-situ data (Argo, GLODAP, WOD, cruise CTD) where floats and casts are separated by tens to hundreds of kilometres.\nGridded data — use with thinning gridded-2d-validation and gridded-3d-validation can also write residuals parquets (see those guides). Dense gridded data violates the independence assumption: a 0.1° North Sea grid might have 50,000 points but a spatial correlation length of ~50 km, giving perhaps a few hundred effective degrees of freedom. Without thinning, Δlog L values will look larger and more significant than they truly are.\nThe spatial_thinning config in those scripts mitigates this:\noutput: save_residuals: true spatial_thinning: stride: 5 # keep every 5th grid point in lat and lon z_stride: 2 # (3D only) keep every 2nd depth level max_rows: 100000 # hard cap Practical guidance:\nStart with stride: 5 and max_rows: 100000. Re-run mle-comparison with stride: 3 and stride: 8; if the relative ranking is stable, the thinning level is sufficient. For 3D gridded obs, also use z_stride: 2 or z_stride: 3 to reduce depth-level correlation. Combining thinned gridded obs with profile obs (--obs-types surface argo) is often more informative than either alone: gridded obs provide dense spatial coverage of the surface; profiles provide depth structure at sparse locations. The SVD step is the same regardless of obs type — the leading modes capture the dominant joint-variance pattern across all supplied obs. For the most defensible results where spatial covariance structure matters, average to regional boxes first and apply MLE to the box means, where the independence assumption is much more defensible.\nComputational cost The method is not computationally intensive. The matrix being decomposed is n_obs × n_exp, and n_exp is always small (typically 3–10).\nStep Complexity Typical size Cost Build common index / key intersection O(n_obs × n_exp) 100k obs, 5 exp negligible DataFrame alignment and sorting O(n_obs log n_obs) — fast SVD of R_std O(n_obs × n_exp²) 100k × 5 seconds Project, log-L, ranking O(r × n_exp) 3 × 5 negligible The SVD is the mathematically dominant step, but because n_exp is tiny scipy uses the thin SVD and the cost scales linearly with n_obs. A 100,000 × 5 matrix takes well under a second.\nThe practical bottleneck is reading and joining the parquet files, not the maths. The residual matrix R lives entirely in RAM: 1 million obs × 10 experiments × 8 bytes = 80 MB, which is negligible for realistic datasets.\nFor gridded data with max_rows: 100000 and stride: 5, the combined parquet stays well under 100 MB and the SVD completes in seconds. Without thinning (full-resolution gridded output) n_obs could reach tens of millions and the in-memory matrix would become expensive; always apply spatial_thinning (see Scope section above).\nLimitations Common obs footprint required: all experiments must cover the same stations and years. Experiments with non-overlapping periods cannot be compared. Diagonal covariance: observation errors are treated as independent and equal within each variable. Spatial correlation between obs is ignored. This is a reasonable approximation for scattered profile data and for thinned gridded data; it becomes increasingly problematic as thinning is relaxed (see Scope above). Low power with few experiments: with fewer than four experiments the SVD modes are poorly constrained and rankings may be unreliable. Pooled σ²: the noise variance is estimated across all experiments. If one experiment is catastrophically wrong, it inflates σ² and compresses the Δlog L differences among the others. ","permalink":"https://bolding-bruggeman.com/oceanicu_3d/guides/mle-comparison/","summary":"\u003ch1 id=\"mle-cross-experiment-comparison-guide\"\u003eMLE Cross-Experiment Comparison Guide\u003c/h1\u003e\n\u003ch2 id=\"overview\"\u003eOverview\u003c/h2\u003e\n\u003cp\u003eStandard validation metrics (RMSE, bias, correlation) compare each experiment against\nobservations in isolation.  When you have three or more experiments that share the same\nobservation dataset — sensitivity runs, ensemble members, or physics variants — a scalar\nmetric gives no information about the joint structure of the errors.\u003c/p\u003e\n\u003cp\u003eMLE comparison in reduced-rank (SVD) space addresses this.  The joint residual matrix\nacross all experiments is decomposed with SVD, and each experiment is ranked by its\nGaussian log-likelihood in the leading modes.  This is the same \u0026ldquo;optimal fingerprinting\u0026rdquo;\nframework used in climate attribution (Allen \u0026amp; Tett 1999): the leading SVD modes capture\nthe dominant joint variance pattern, and the log-likelihood in that low-dimensional space\nis a principled, multi-dimensional distance from perfect.\u003c/p\u003e","title":"MLE Comparison"},{"content":"run-analyses Guide This guide used to document a run-validation command. That command no longer exists — it was replaced by run-analyses (cli/run_analyses.py), which has a different config layout and CLI. This page now documents the current tool; the title and URL are unchanged.\nOverview run-analyses is the master orchestrator. It calls each step\u0026rsquo;s own CLI entry point as a subprocess, reusing one YAML config per step (config/run_analyses.yaml maps step names to those per-step config files).\nUse it when you want to run several validation or scenario steps for one area/experiment in one command. For individual analysis types — and for anything that needs --source/--model/--scenario (NSe\u0026rsquo;s workflow) — run the dedicated scripts directly (e.g. argo-profiles, tidal-analysis); run-analyses does not forward those flags, only --area, --experiment, --years, and --analyses-dir.\nConfig structure # config/run_analyses.yaml — maps step names to their per-step YAML config validations: gridded_2d: config/gridded_2d_validation.yaml gridded_3d: config/gridded_3d_validation.yaml tidal: config/tidal_analysis.yaml fixed_platform: config/fixed_platform.yaml station_timeseries: config/station_timeseries.yaml cruise_ctd: config/cruise_ctd_profiles.yaml argo: config/argo_profiles.yaml glodap: config/glodap_profiles.yaml wod: config/wod_profiles.yaml ices: config/ices_profiles.yaml scenarios: single_scenario: config/single_scenario.yaml multi_scenario: config/multi_scenario.yaml Per-step extra flags can be added with a dict instead of a plain path:\nvalidations: tidal: config: config/tidal_analysis.yaml args: [--layers, surface, bottom] # step-specific extra flags Omit any step that does not apply to this project.\nUsage # Run all validation steps run-analyses validations --area NS --experiment Baseline # Override years across every step run-analyses validations --area NS --experiment Baseline --years 2010 2022 # Run a single step (useful for debugging or re-running one analysis) run-analyses validations --area NS --experiment Baseline --step tidal # Skip one step, run the rest run-analyses validations --area NS --experiment Baseline --no-tidal # Scenario steps run-analyses scenarios --area NS --experiment Baseline # List all recognised step names run-analyses --list-steps # Preview without running anything run-analyses validations --area NS --experiment Baseline --dryrun --analyses-dir overrides output.analyses_dir in every step\u0026rsquo;s config; as with the individual scripts, there is no ./analyses fallback — see Tidal Analysis: analyses_dir has no default.\nStep names Validation steps (run order):\nStep name Analysis run gridded_2d gridded-2d-validation gridded_3d gridded-3d-validation tidal tidal-analysis fixed_platform fixed-platform station_timeseries station-timeseries cruise_ctd cruise-ctd-profiles argo argo-profiles glodap glodap-profiles wod wod-profiles ices ices-profiles Scenario steps (run order): single_scenario (single-scenario), multi_scenario (multi-scenario).\nEach step can be skipped with --no-\u0026lt;step-name-with-dashes\u0026gt;, e.g. --no-gridded-2d, --no-fixed-platform.\nError handling Each step runs independently. If one step fails it is logged and the orchestrator continues with the remaining steps, unless --stop-on-error is given. Failed steps are listed in the final summary. Exit code is non-zero if any step failed.\nPartial runs with \u0026ndash;step --step is useful when:\nA single step failed and needs to be re-run after fixing the config. You want to add a new analysis type without re-running everything. You are debugging a specific script. # Re-run only tidal analysis after fixing the tidal config run-analyses validations --area NS --experiment Baseline --step tidal Relationship to individual scripts run-analyses delegates to the same individual scripts that you can call directly, as a subprocess per step. The per-step config files (e.g. config/argo_profiles.yaml) are passed through unchanged, with --area, --experiment, --years, and --analyses-dir overridden from the orchestrator\u0026rsquo;s own command line.\nFor --source/--model/--scenario (NSe\u0026rsquo;s per-source workflow, --no-model, per-step --dataset-name, or any other script-specific flag not listed under \u0026ldquo;Step names\u0026rdquo; above — run the individual scripts directly instead of going through the orchestrator.\n","permalink":"https://bolding-bruggeman.com/oceanicu_3d/guides/run-validation/","summary":"\u003ch1 id=\"run-analyses-guide\"\u003erun-analyses Guide\u003c/h1\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThis guide used to document a \u003ccode\u003erun-validation\u003c/code\u003e command. That command no\nlonger exists — it was replaced by \u003ccode\u003erun-analyses\u003c/code\u003e (\u003ccode\u003ecli/run_analyses.py\u003c/code\u003e),\nwhich has a different config layout and CLI. This page now documents the\ncurrent tool; the title and URL are unchanged.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003ch2 id=\"overview\"\u003eOverview\u003c/h2\u003e\n\u003cp\u003e\u003ccode\u003erun-analyses\u003c/code\u003e is the master orchestrator.  It calls each step\u0026rsquo;s own CLI\nentry point as a subprocess, reusing one YAML config per step\n(\u003ccode\u003econfig/run_analyses.yaml\u003c/code\u003e maps step names to those per-step config\nfiles).\u003c/p\u003e","title":"Run Validation"},{"content":"Scenario Analysis Guide Overview The scenario workflow has three stages:\nCMIP6 forcing ──► bc correct ──► bias-corrected forcing │ ocean model (future run) │ ┌─────────────┴─────────────┐ single-scenario multi-scenario (trends, changes) (SSP comparison) Bias-correct CMIP6 atmospheric forcing against ERA5 (or equivalent) so its statistical properties match the observational reference over the calibration period. Run the ocean model with the corrected forcing for each SSP scenario. Analyse the ocean output — trend maps, time series, regional means — for one scenario at a time or across multiple scenarios simultaneously. Step 1 — Bias correction Note: bc correct, bc diagnostics, and bc check have moved to ocean-prep. Install and run them from the ocean-prep repo. Config and guides are at ocean-prep/config/bc_correct_example.yaml and ocean-prep/guides/.\nCommands (run from ocean-prep) Command Role bc correct Apply bias correction → write corrected NetCDF bc diagnostics Inspect correction → maps, seasonal cycles, trend plots Aliases: bc-correct, bc-diagnostics.\nSpecialised variable guides Some variables require extra treatment beyond a straightforward QDM:\nGuide Variable What it covers Humidity bias correction huss Convert ERA5 d2m + sp → specific humidity before QDM Radiation bias correction net_sw, net_lw Correct net (not downwelling-only) radiation using ERA5 ssr/str and CMIP6 rsds−rsus/rlds−rlus; confirms CMIP6 availability River projection river flow \u0026amp; loads Delta-change method for freshwater inputs using bias-corrected P/E Correction methods Method Flag Description Quantile delta mapping qdm Preserves relative future trends; corrects full distribution Quantile mapping qm Corrects distribution but suppresses climate change signal Delta (additive) delta Fast; corrects mean only qdm is the recommended default for most variables.\nConfig structure # config/bc.yaml metadata: author: \u0026#34;K. Bolding\u0026#34; institute: \u0026#34;BB\u0026#34; project: \u0026#34;NorthSea-MFC\u0026#34; area: NS experiment: ssp245 scenario: ssp245 domain: lon_min: -5.0; lon_max: 10.0 lat_min: 50.0; lat_max: 62.0 calibration: start: \u0026#34;1990-01-01\u0026#34; end: \u0026#34;2014-12-31\u0026#34; future: start: \u0026#34;2015-01-01\u0026#34; end: \u0026#34;2100-12-31\u0026#34; correction: method: qdm n_quantiles: 100 variables: - name: tas kind: additive # additive or multiplicative - name: pr kind: multiplicative reference: # ERA5 or equivalent observational reference tas: source: local path: /data/era5/tas_{year}.nc variable: t2m pr: source: local path: /data/era5/pr_{year}.nc variable: tp historical: # CMIP6 historical member tas: uri: \u0026#34;cmip6://MPI-ESM1-2-HR/historical/tas/day/r1i1p1f1\u0026#34; pr: uri: \u0026#34;cmip6://MPI-ESM1-2-HR/historical/pr/day/r1i1p1f1\u0026#34; future_model: # CMIP6 future scenario member tas: uri: \u0026#34;cmip6://MPI-ESM1-2-HR/ssp245/tas/day/r1i1p1f1\u0026#34; pr: uri: \u0026#34;cmip6://MPI-ESM1-2-HR/ssp245/pr/day/r1i1p1f1\u0026#34; output: dir: ./bc_output/{scenario} filename_pattern: \u0026#34;{variable}_bc_{year}.nc\u0026#34; compress: true Config in ocean-prep: config/bc_correct_example.yaml\nRunning the correction # Full run bc correct --config config/bc.yaml # Single variable / override method / override scenario bc correct --config config/bc.yaml --variable tas bc correct --config config/bc.yaml --method qdm bc correct --config config/bc.yaml --scenario ssp585 # Stages: correction only or disaggregation only bc correct --config config/bc.yaml --steps correct bc correct --config config/bc.yaml --steps disaggregate Disaggregation distributes daily corrected output to sub-daily resolution using a diurnal ERA5 climatology. Requires a disaggregation: block in the config.\nCorrection output bc_output/ssp245/ tas_bc_2015.nc … tas_bc_2100.nc pr_bc_2015.nc … pr_bc_2100.nc Running diagnostics bc diagnostics --config config/bc.yaml bc diagnostics --config config/bc.yaml --variable tas bc diagnostics --config config/bc.yaml --output-dir ./diag/ssp245/ Results land under analyses/areas/\u0026lt;area\u0026gt;/scenarios/\u0026lt;scenario\u0026gt;/:\nanalyses/areas/NS/scenarios/ssp245/ └── tas/ ├── plots/ │ ├── calibration_maps.png — reference | CMIP6 raw | bias │ ├── seasonal_cycle.png — monthly climatology comparison │ ├── future_trend.png — annual means + linear trend to 2100 │ └── monthly_breakdown.png — decadal heatmap └── tables/ └── statistics.txt — per-month RMSE / bias / correlation Multiple scenarios for scenario in ssp245 ssp370 ssp585; do bc correct --config config/bc.yaml --scenario $scenario bc diagnostics --config config/bc.yaml --scenario $scenario done Step 2 — Single scenario analysis single-scenario analyses ocean model output from one future projection: trends (linear or Theil-Sen), anomalies relative to a reference period, and period-to-period changes over one or more future periods.\nVariables may be physics (sst, sss, ssh, temp, salt, \u0026hellip;) or biogeochemical (chl, doxy, ph, ntra, phos, \u0026hellip;) — mix them freely in one run. Each variable\u0026rsquo;s domain (physics/bio) is detected automatically and routes its own plots/tables under the matching physics/bio subtree (see Output below); nothing extra needs configuring to include bio variables alongside physics ones.\nConfig # config/single_scenario.yaml area: NS scenario: name: SSP2-4.5 experiment: ssp245 period: \u0026#34;2020-2100\u0026#34; variables: - sst - sss - ssh - chl # bio - doxy # bio - ph # bio model: base_path: ${MODEL_DATA_ROOT}/{user}/{area}/{experiment} filename_pattern: \u0026#34;*.nc\u0026#34; reference_period: start: \u0026#34;1985-01-01\u0026#34; end: \u0026#34;2014-12-31\u0026#34; future_periods: - name: \u0026#34;Near-term (2030s)\u0026#34; start: \u0026#34;2030-01-01\u0026#34; end: \u0026#34;2039-12-31\u0026#34; - name: \u0026#34;Mid-century (2050s)\u0026#34; start: \u0026#34;2050-01-01\u0026#34; end: \u0026#34;2059-12-31\u0026#34; - name: \u0026#34;End-century (2090s)\u0026#34; start: \u0026#34;2090-01-01\u0026#34; end: \u0026#34;2099-12-31\u0026#34; analysis: compute_trends: true trend_method: linear # linear | theil-sen compute_anomalies: true output: analyses_dir: \u0026#34;${OCEANICU_ANALYSES_FOLDER}\u0026#34; # no default — see tidal-analysis.md Config: config/single_scenario.yaml\nUsage single-scenario --config config/single_scenario.yaml single-scenario --config config/single_scenario.yaml --scenario ssp585 Output analyses/areas/NS/validations/ssp245/ plots/physics/model/2020-2100/scenario/ sst_timeseries.png — area-mean annual time series sst_trend_ssp245.png — trend map with significance stippling sst_change_maps.png — one panel per future period vs. reference plots/bio/model/2020-2100/scenario/ chl_timeseries.png chl_trend_ssp245.png chl_change_maps.png tables/physics/model/scenario/ sst_scenario_statistics.txt sst_scenario_statistics.yaml — same content, machine-readable sidecar tables/bio/model/scenario/ chl_scenario_statistics.txt chl_scenario_statistics.yaml \u0026lt;model\u0026gt; and the 2020-2100 period label come from model.name (defaults to model if unset) and the span from reference_period.start to the last future_periods[].end — same AnalysesLayout convention gridded-2d-validation/tidal-analysis use, so the results feed into the same Hugo page generation and statistics.db as every other analysis type.\nStep 3 — Multi-scenario comparison multi-scenario loads output from multiple SSP runs and overlays them — time series comparison and a per-variable comparison table across scenarios. Same physics/bio variable mixing as single-scenario above.\nConfig # config/multi_scenario.yaml area: NS scenarios: - name: SSP1-2.6 experiment: ssp126 - name: SSP2-4.5 experiment: ssp245 - name: SSP5-8.5 experiment: ssp585 variables: - sst - sss - ssh - chl # bio - doxy # bio - ph # bio model: base_path: ${MODEL_DATA_ROOT}/{user}/{area}/{experiment} filename_pattern: \u0026#34;*.nc\u0026#34; reference_period: start: \u0026#34;1985-01-01\u0026#34; end: \u0026#34;2014-12-31\u0026#34; comparison_name: ssp_comparison # optional; defaults to the joined experiment ids analysis: trend_method: linear # linear | theil-sen output: analyses_dir: \u0026#34;${OCEANICU_ANALYSES_FOLDER}\u0026#34; # no default — see tidal-analysis.md Config: config/multi_scenario.yaml\nUsage multi-scenario --config config/multi_scenario.yaml Output analyses/areas/NS/scenarios/ssp_comparison/ plots/ sst_multi_scenario_timeseries.png — all SSPs on one axis chl_multi_scenario_timeseries.png tables/ sst_multi_scenario_statistics.txt sst_comparison.csv — mean/std/trend/p-value per scenario chl_multi_scenario_statistics.txt chl_comparison.csv Unlike single-scenario\u0026rsquo;s output, this comparison tree isn\u0026rsquo;t picked up automatically by Hugo page generation yet — there\u0026rsquo;s no per-experiment directory a multi-scenario comparison maps to in the same way a single scenario run does.\nPerformance notes Bias correction uses Dask lazy loading; memory stays bounded because output is written year by year. Diagnostics use a time-only chunk path — typically ~2 s/year. Regridding weights are cached under cache.dir and reused across variables and scenarios with the same grids. ","permalink":"https://bolding-bruggeman.com/oceanicu_3d/guides/scenarios/","summary":"\u003ch1 id=\"scenario-analysis-guide\"\u003eScenario Analysis Guide\u003c/h1\u003e\n\u003ch2 id=\"overview\"\u003eOverview\u003c/h2\u003e\n\u003cp\u003eThe scenario workflow has three stages:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eCMIP6 forcing  ──► bc correct ──► bias-corrected forcing\n                                        │\n                               ocean model (future run)\n                                        │\n                         ┌─────────────┴─────────────┐\n                   single-scenario              multi-scenario\n                  (trends, changes)       (SSP comparison)\n\u003c/code\u003e\u003c/pre\u003e\u003col\u003e\n\u003cli\u003e\u003cstrong\u003eBias-correct\u003c/strong\u003e CMIP6 atmospheric forcing against ERA5 (or equivalent)\nso its statistical properties match the observational reference over the\ncalibration period.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eRun the ocean model\u003c/strong\u003e with the corrected forcing for each SSP scenario.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eAnalyse\u003c/strong\u003e the ocean output — trend maps, time series, regional means —\nfor one scenario at a time or across multiple scenarios simultaneously.\u003c/li\u003e\n\u003c/ol\u003e\n\u003chr\u003e\n\u003ch2 id=\"step-1--bias-correction\"\u003eStep 1 — Bias correction\u003c/h2\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u003cstrong\u003eNote:\u003c/strong\u003e \u003ccode\u003ebc correct\u003c/code\u003e, \u003ccode\u003ebc diagnostics\u003c/code\u003e, and \u003ccode\u003ebc check\u003c/code\u003e have moved to\n\u003cstrong\u003eocean-prep\u003c/strong\u003e.  Install and run them from the \u003ccode\u003eocean-prep\u003c/code\u003e repo.\nConfig and guides are at \u003ccode\u003eocean-prep/config/bc_correct_example.yaml\u003c/code\u003e and\n\u003ccode\u003eocean-prep/guides/\u003c/code\u003e.\u003c/p\u003e","title":"Scenario Analysis"},{"content":"push-to-remote Guide Overview push-to-remote is the other half of the post-simulation handoff, alongside update-from-remote. Run it on the simulation server (e.g. an HPC login node) right after a batch of analyses finishes there, to send the results to the machine that actually generates and deploys the Hugo site (the \u0026ldquo;analysis server\u0026rdquo;, e.g. bb-server1).\nIt exists because the two machines are not symmetrically reachable: the simulation server typically has outgoing network access only, and the analysis server has no route back to it at all. Any transfer must be initiated from the simulation server, pushing out — never initiated from the analysis server trying to pull in. push-to-remote wraps manage-analyses sync ... --put, which is exactly that: an rsync, run from here, pushing local files out.\nBasic usage # Dry run first (shows what would transfer, moves nothing): push-to-remote kb@bb-server1:/data/OceanICU/oceanicu_3d/analyses/ ./analyses # Actually push: push-to-remote kb@bb-server1:/data/OceanICU/oceanicu_3d/analyses/ ./analyses --apply # With a specific SSH key: push-to-remote kb@bb-server1:/data/OceanICU/oceanicu_3d/analyses/ ./analyses --apply --ssh ~/.ssh/id_rsa REMOTE is the destination path on the analysis server. LOCAL_ANALYSES is this machine\u0026rsquo;s own local analyses directory (the one your analysis scripts just wrote into).\nOnly files matching the canonical analyses/ layout are transferred — plots/tables under areas/*/validations/*/..., the BC scenarios tree, simulation_list.db, statistics.db, staging/**. Old-layout files at the wrong directory depth are excluded automatically (see manage-analyses).\nThis step only moves files into place. It does not generate any web pages and does not touch the live site.\nThe full handoff On the simulation server (e.g. scylla, after a run finishes): push-to-remote kb@bb-server1:/data/OceanICU/oceanicu_3d/analyses/ ./analyses --apply On the analysis server (e.g. bb-server1) -- --no-sync because the push already moved the files; a plain sync here would try to pull FROM the simulation server, which the analysis server usually can\u0026#39;t reach: update-from-remote kb@simserver:/path/to/its/analyses/ /data/OceanICU/oceanicu_3d/analyses \\ --no-sync --apply --deploy update-from-remote\u0026rsquo;s own REMOTE argument is still required (no defaults, by design — see its guide) even with --no-sync, but is unused in that mode; any placeholder value works.\nAlternative: regenerate + deploy directly from the simulation server You don\u0026rsquo;t have to log into the analysis server separately to finish the job. The calling project\u0026rsquo;s own regenerate_hugo.py and this repo\u0026rsquo;s deploy_ghpages.py both auto-relay over SSH to the real analysis/relay host (see each project\u0026rsquo;s own regen_hosts.yaml / deploy_hosts.yaml) — whichever machine they\u0026rsquo;re run from — with no entry needed for the calling machine itself in either YAML file. Relaying only forwards the command; it never needs to look up the caller\u0026rsquo;s own host config, so a new machine (the simulation server) needs no new config to do this.\nSo right after the push above, from the same simulation-server session:\ncd ~/source/repos/OceanICU/oceanicu_3d # the CODE repo checkout (not analyses) ./regenerate_hugo.py --apply # relays to bb-server1, regenerates cd ~/source/repos/ocean-post ./deploy_ghpages.py --apply # relays to bb-server1, builds + pushes gh-pages Both commands actually execute on the analysis server (that\u0026rsquo;s what the relay does) using its own real paths — this is equivalent to update-from-remote --no-sync --apply --deploy, just two separate calls instead of one, and without needing update-from-remote\u0026rsquo;s own merge/scan steps. Pick whichever\u0026rsquo;s more convenient; they end up running the identical underlying code either way.\nPrerequisite, not yet verified from this side: this needs a checkout of the oceanicu_3d code repo (not just an analyses tree) on the simulation server, since regenerate_hugo.py has to run locally first before it can relay. If that checkout doesn\u0026rsquo;t exist yet there, add one (git clone git@github.com:BoldingBruggeman/oceanicu_3d.git) — no other setup needed; regen_hosts.yaml/deploy_hosts.yaml need no new entry for this machine.\nTwo bugs fixed 2026-10-07 update-from-remote --deploy used to silently do nothing (the underlying deploy_ghpages.py call omitted --apply, so it just printed its own help and exited 0). And --hugo-dir\u0026rsquo;s default pointed at the Hugo site directory under $HOME, which ocean-reporting --hugo then also used as the content-output root — wrong on bb-server1, where real generated content/static live under /data/OceanICU/oceanicu_3d instead (to avoid filling up $HOME; see regen_hosts.yaml\u0026rsquo;s own comment). Both fixed in commit 7cecf42; update-from-remote now does the right thing with no extra flags needed, exactly as shown above.\n","permalink":"https://bolding-bruggeman.com/oceanicu_3d/guides/push-to-remote/","summary":"\u003ch1 id=\"push-to-remote-guide\"\u003epush-to-remote Guide\u003c/h1\u003e\n\u003ch2 id=\"overview\"\u003eOverview\u003c/h2\u003e\n\u003cp\u003e\u003ccode\u003epush-to-remote\u003c/code\u003e is the other half of the post-simulation handoff, alongside\n\u003ca href=\"update-from-remote.md\"\u003eupdate-from-remote\u003c/a\u003e. Run it \u003cstrong\u003eon the simulation\nserver\u003c/strong\u003e (e.g. an HPC login node) right after a batch of analyses finishes\nthere, to send the results to the machine that actually generates and\ndeploys the Hugo site (the \u0026ldquo;analysis server\u0026rdquo;, e.g. \u003ccode\u003ebb-server1\u003c/code\u003e).\u003c/p\u003e\n\u003cp\u003eIt exists because the two machines are not symmetrically reachable: the\nsimulation server typically has outgoing network access only, and the\nanalysis server has no route back to it at all. Any transfer must be\n\u003cstrong\u003einitiated from the simulation server\u003c/strong\u003e, pushing out — never initiated\nfrom the analysis server trying to pull in. \u003ccode\u003epush-to-remote\u003c/code\u003e wraps\n\u003ccode\u003emanage-analyses sync ... --put\u003c/code\u003e, which is exactly that: an \u003ccode\u003ersync\u003c/code\u003e, run\nfrom here, pushing local files out.\u003c/p\u003e","title":"Push To Remote"},{"content":"River Flow and Nutrient Load Projection Guide river-projection (stage 1, below) lives in ocean-prep, alongside bc-correct/bc-diagnostics — install and run it from the ocean-prep repo (cli/river_projection.py), with its config at ocean-prep/config/river_projection_example.yaml. river-diagnostics (stage 2) stays in ocean-post. Confirmed 2026-10-07; this page previously referenced a config/river_projection.yaml in ocean-post that was never there, and the real tool and config were found in ocean-prep instead. No project-specific copy of the config exists yet in this checkout — the only one found is ocean-prep\u0026rsquo;s own example.\nOverview This guide describes how to project future river flows and nutrient loadings using the delta-change method: bias-corrected gridded precipitation (P) and evapotranspiration (E) from CMIP6 are used to scale the observed seasonal discharge cycle from the EMORID dataset forward in time. Nutrient loads are then computed by multiplying projected discharge by an observed flow-weighted mean concentration.\nEMORID observed Q + nutrients │ ├─── monthly Q climatology ──────────────────────────┐ │ (calibration period) │ │ ▼ ERA5 P, E (reference) Q_future = Q_clim(month) × ΔPE(t) │ │ └─── P–E climatology ────────────────► ΔPE(t) │ (calibration period, denominator) │ │ BC future P, E (CMIP6) ▼ │ nutrient loads = Q_future × FWMC └─── future P–E ──────────────────────► (numerator) Commands # Stage 1 (ocean-prep): project future flows and nutrient loads river-projection --config config/river_projection_example.yaml --model MPI-ESM1-2-HR --scenario ssp245 river-projection --config config/river_projection_example.yaml --model MPI-ESM1-2-HR --scenario ssp585 river-projection --config config/river_projection_example.yaml --model MPI-ESM1-2-HR --scenario ssp245 --dryrun river-projection --config config/river_projection_example.yaml --model MPI-ESM1-2-HR --scenario ssp245 --allow-missing # Stage 2 (ocean-post): generate diagnostic plots and tables from the projection output river-diagnostics --config config/river_projection_example.yaml --model MPI-ESM1-2-HR --scenario ssp245 river-diagnostics --config config/river_projection_example.yaml --model MPI-ESM1-2-HR --scenario ssp245 --analyses-dir /data/local/analyses --model is required by river-projection (either metadata.model in the config or --model) — it resolves {model} in the forcing and output paths alongside --scenario.\nConfig on GitHub: config/river_projection_example.yaml (in ocean-prep)\nInput data Dataset Location Content EMORID observed flows ${EMORID_FOLDER}/to_netcdf/EMORID_1990_2024.nc daily Q + nutrients ERA5 precipitation ${ERA5_FOLDER}/era5_tp_{year}.nc Hourly accumulation (m), variable tp — reference P–E climatology ERA5 evaporation ${ERA5_FOLDER}/era5_e_{year}.nc Hourly accumulation (m), variable e, negative for upward flux BC future P/E (separate) from bc-correct (ocean-prep) Daily, one file per year, variables pr/evspsbl (kg m⁻² s⁻¹) BC future P−E (composite) from bc-correct (ocean-prep) Jointly corrected pe, preferred over separate pr/evspsbl when present — see \u0026ldquo;The pe composite\u0026rdquo; below EMORID variables available: Q, TotalN, NO3, NH4, DIN, TotalP, PO4, Si, DOC, DIC, SPM. Countries covered: 18 (NE Atlantic and Baltic rim).\nMethod Step 1 — Station filtering Stations are filtered to retain only those with ≥ min_years (default 10) of valid daily Q. This removes gauges with very short or mostly-missing records that would produce unreliable climatologies.\nStations in Norway, Finland, Sweden, and Iceland are flagged with regulated_flag = True in the output but are not excluded. Rivers in these countries are heavily influenced by snowmelt timing and hydropower operations, so the P–E relationship does not hold as reliably as for rainfall-dominated catchments. Projections for flagged stations should be interpreted with caution.\nStep 2 — Associate stations with gridded P–E Each station is paired with the nearest grid cell in the ERA5 P and E fields (for the climatology) and the bias-corrected future P and E fields (for the projection) using nearest-neighbour selection on (lat, lon).\nThis is a practical approximation: in the absence of catchment boundary polygons the point extraction captures the local climate signal but not the integrated catchment response. A future improvement would ingest catchment boundary polygons (e.g. HydroSHEDS) and compute proper area-weighted P–E over each drainage basin. The delta-change method is robust to this approximation because it relies only on the relative change in P–E, not its absolute value.\nStep 3 — Monthly P–E climatology (calibration period) The mean monthly P–E at each station is computed over the calibration period (e.g. 1990–2019) from ERA5, which is the observational reference:\nPE_ref_clim(m) = mean over t in calibration period of [P_ERA5(t) - E_ERA5(t)] where month(t) = m This 12-value climatology forms the denominator of the delta-change factor.\nWhy ERA5 and not bias-corrected historical? The BC future files are anchored to the ERA5 climatological distribution by construction. Dividing the future P–E by the ERA5 climatology therefore recovers the pure CMIP6 climate-change signal. Bias-corrected historical files would give the same result (ERA5 ≈ BC-historical by construction) and are not needed.\nERA5 units and sign convention: ERA5 tp/e are hourly accumulations in metres; CMIP6\u0026rsquo;s bias-corrected pr/evspsbl are daily-mean fluxes in kg m⁻² s⁻¹. Both ERA5 variables are resampled to daily totals (resample: daily, summing the 24 hourly values) and then scaled by 0.011574 (= 1000/86400/24) to match that flux convention. ERA5 e is also stored as a negative accumulation (upward flux = surface loss), so its scale factor is -0.011574 — the sign flip and the unit conversion combined into one number.\nStep 4 — Observed monthly Q climatology (calibration period) The mean monthly observed discharge at each station is computed from EMORID over the same calibration period:\nQ_clim(m) = mean over t in calibration period of Q_obs(t) where month(t) = m This is the baseline seasonal cycle that the delta-change method preserves.\nStep 5 — Delta-change factor For each future time step t the delta-change factor is:\nΔPE(t) = PE_future(t) / PE_hist_clim(month(t)) where PE_future(t) = P_future(t) − E_future(t) from the bias-corrected future forcing.\nInterpretation: ΔPE(t) = 1.2 means the future P–E in that month is 20 % higher than the historical climatological value, so the projected discharge is also 20 % higher.\nHandling non-positive P–E: In arid regions or summer months, the historical P–E climatology can be zero or negative (evaporation exceeds precipitation). Division by a non-positive value is physically undefined for this method; those cells are set to ΔPE = 1.0 (no change) and logged as warnings. If many stations trigger this condition, consider extending the calibration period or reviewing the evaporation variable.\nStep 6 — Projected river discharge Q_future(t) = Q_clim(month(t)) × ΔPE(t) Values are clipped to zero (no negative discharge).\nWhy delta-change rather than a full rainfall-runoff model? The delta-change method preserves the observed seasonal cycle and inter-annual variability pattern of discharge without requiring catchment area, soil parameters, or routing. It applies only the climate-driven fractional change in water availability (P–E) to the observed flow. The method is widely used for first-order assessments when catchment characteristics are not available.\nStep 7 — Flow-weighted mean concentration (FWMC) For each nutrient species and station:\nFWMC = Σ(Q(t) × C(t)) / Σ(Q(t)) over the FWMC period The FWMC period is configured independently from the calibration period. Use a recent sub-period (e.g. 2010–2023) rather than the full record to reflect current nutrient conditions; older data from the 1990s may overestimate future loads in rivers that have improved under EU nutrient directives such as the Water Framework Directive and Nitrates Directive.\nBoth Q and C must be finite for a time step to enter the sum. Stations with no valid Q–C overlap for a given nutrient receive FWMC = NaN and are excluded from load projections for that nutrient.\nStep 8 — Projected nutrient loads Load_future(t) = Q_future(t) × FWMC [kg s⁻¹ if C in kg m⁻³] This assumes in-catchment nutrient sources and in-stream processing remain at their current level. This is a conservative baseline; a separate scenario analysis can relax it by applying trend-based or policy-driven adjustments to FWMC.\nConfiguration # ocean-prep/config/river_projection_example.yaml metadata: scenario: ssp126 # override at run time with --scenario model: MPI-ESM1-2-HR # override at run time with --model emorid: path: \u0026#34;${EMORID_FOLDER}/to_netcdf/EMORID_1990_2024.nc\u0026#34; station_filter: min_years: 10 # minimum years of valid daily Q calibration: start: \u0026#34;1990-01-01\u0026#34; end: \u0026#34;2019-12-31\u0026#34; future: start: \u0026#34;2015-01-01\u0026#34; end: \u0026#34;2099-12-31\u0026#34; fwmc: # period for flow-weighted mean concentrations start: \u0026#34;2010-01-01\u0026#34; # omit this block to use the full EMORID record end: \u0026#34;2023-12-31\u0026#34; nutrients: - TotalN - TotalP - DIN domain: lon_min: -20.0 lon_max: 40.0 lat_min: 45.0 lat_max: 75.0 forcing: # ERA5: denominator of the delta-change factor (P–E climatology). reference: pr: path: \u0026#34;${ERA5_FOLDER}/era5_tp_{year}.nc\u0026#34; variable: tp scale_factor: 0.011574 # hourly accumulation (m) → daily kg m⁻² s⁻¹ resample: daily # hourly → daily sum evspsbl: path: \u0026#34;${ERA5_FOLDER}/era5_e_{year}.nc\u0026#34; variable: e scale_factor: -0.011574 # sign flip (ERA5 e is negative) + unit conversion resample: daily # BC future: numerator of the delta-change factor. {model}/{scenario} # substituted from metadata/--model/--scenario; {method} (regridding # method, e.g. qdm/bilinear) is left as a glob (*) rather than hardcoded, # since pr and evspsbl may use different methods. future: pr: path: \u0026#34;${BIAS_CORRECTED_FOLDER}/CMIP6/{model}/{scenario}/meteo/pr_bc_*_{scenario}_{year}.nc\u0026#34; variable: pr evspsbl: path: \u0026#34;${BIAS_CORRECTED_FOLDER}/CMIP6/{model}/{scenario}/meteo/evspsbl_bc_*_{scenario}_{year}.nc\u0026#34; variable: evspsbl # Jointly bias-corrected P-E composite, preferred over separate pr − # evspsbl when present (auto-detected by real file presence per # model/scenario — not every model produces it, e.g. GFDL-ESM4\u0026#39;s CMIP6 # hfls is Amon-only). See \u0026#34;The pe composite\u0026#34; below. pe: path: \u0026#34;${BIAS_CORRECTED_FOLDER}/CMIP6/{model}/{scenario}/meteo/pe_bc_*_{scenario}_{year}.nc\u0026#34; variable: pe output: dir: \u0026#34;${BIAS_CORRECTED_FOLDER}/CMIP6/{model}/{scenario}/rivers\u0026#34; compress: true analyses_dir: \u0026#34;${OCEANICU_ANALYSES_FOLDER}\u0026#34; # not used by river-projection itself today — # a placeholder for river-diagnostics (stage 2) {model} and {scenario} in the future forcing paths and output.dir are substituted at runtime from metadata.model/metadata.scenario (or --model/--scenario). This makes it straightforward to run multiple models and SSPs from the one shared config:\nfor scenario in ssp126 ssp370 ssp585; do river-projection --config config/river_projection_example.yaml \\ --model MPI-ESM1-2-HR --scenario $scenario done The pe composite When forcing.future.pe is present in the config, river-projection probes for real output at that path for the current --model/--scenario before using it: if found, it uses the jointly bias-corrected P−E composite instead of separately-corrected pr − evspsbl (separate correction does not guarantee the difference preserves ERA5\u0026rsquo;s own P–E climatology). If no pe output exists for that model/scenario, it logs this and falls back to pr/evspsbl automatically — the same shared config works for every model via --model without a per-model variant.\nOutput Two NetCDF files are written per run, both with dimensions (site, time):\nFile Variables Description river_flows_future_\u0026lt;scenario\u0026gt;.nc Q, regulated_flag Projected monthly discharge (m³ s⁻¹) nutrient_loads_future_\u0026lt;scenario\u0026gt;.nc TotalN, TotalP, DIN, … Projected loads (kg s⁻¹) Global attributes record the scenario name, calibration and future periods, and the FWMC period. These are written to output.dir (not into the analyses_dir/validations tree) — output.analyses_dir in the config is not used by river-projection itself; it only matters to river-diagnostics below.\nDiagnostics After running river-projection, use river-diagnostics (ocean-post) to generate plots and tables from the projection output. It reads the same config file (for metadata, emorid, and output.dir) and writes into the canonical analyses layout:\n\u0026lt;analyses_dir\u0026gt;/scenarios/\u0026lt;model\u0026gt;/\u0026lt;scenario\u0026gt;/river/ plots/ q_change_map_\u0026lt;scenario\u0026gt;.png # station map coloured by % Q change q_time_series_\u0026lt;scenario\u0026gt;.png # annual mean Q: calibration + near/mid/far future q_seasonal_\u0026lt;scenario\u0026gt;.png # monthly Q climatology by period nutrient_loads_\u0026lt;scenario\u0026gt;.png # annual nutrient load time series tables/ river_projection_statistics_\u0026lt;scenario\u0026gt;.csv river_projection_statistics_\u0026lt;scenario\u0026gt;.txt river-diagnostics --config config/river_projection_example.yaml --model MPI-ESM1-2-HR --scenario ssp245 river-diagnostics --config config/river_projection_example.yaml --model MPI-ESM1-2-HR --scenario ssp585 river-diagnostics --config config/river_projection_example.yaml --model MPI-ESM1-2-HR --scenario ssp245 --analyses-dir /data/local/analyses --analyses-dir overrides output.analyses_dir from the config and has no ./analyses fallback — see Tidal Analysis: analyses_dir has no default. --scenario and --model override the corresponding metadata keys.\nThe diagnostics are automatically picked up by ocean-reporting and included in the Hugo scenarios page under a River Flow and Nutrient Load Projections section.\nDry run Use --dryrun to check the config and probe forcing-file existence (every probed year, for both ERA5 reference and BC future — plus the pe auto- detect probe when configured) without loading any data:\nriver-projection --config config/river_projection_example.yaml --model MPI-ESM1-2-HR --scenario ssp245 --dryrun Both --dryrun and a real run exit non-zero if any probed year is missing — a config/filename mismatch is meant to fail loudly, not silently degrade the projection. Pass --allow-missing only for genuinely partial, expected coverage (e.g. a scenario whose later years are not produced yet).\nLimitations and future improvements Limitation Impact Potential improvement Nearest-neighbour P–E extraction Ignores catchment shape; grid noise can affect individual stations Ingest HydroSHEDS catchment polygons and compute area-weighted P–E Constant FWMC Does not capture land-use change or emission trends Fit a trend to historical C(t) and extrapolate; or apply emission scenario adjustments Regulated rivers flagged but not excluded Delta-change projections less physically meaningful for snowmelt / hydropower dominated basins Separate treatment using temperature-based snowmelt model No uncertainty from FWMC Single FWMC value per station Bootstrap confidence intervals on FWMC from the observed record Key references Arnell (1999), Climate change and global water resources, Global Environmental Change 9, S31–S49. — Foundation of the delta-change approach for river flow projections. Middelkoop et al. (2001), Impact of climate change on hydrological regimes and water resources management in the Rhine basin, Climatic Change 49, 105–128. — Applied delta-change example. Kronvang et al. (2009), Nitrogen and phosphorus losses from agricultural areas in European river basins, Science of the Total Environment. — FWMC methodology context for riverine nutrient loads. ","permalink":"https://bolding-bruggeman.com/oceanicu_3d/guides/river-projection/","summary":"\u003ch1 id=\"river-flow-and-nutrient-load-projection-guide\"\u003eRiver Flow and Nutrient Load Projection Guide\u003c/h1\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u003cstrong\u003e\u003ccode\u003eriver-projection\u003c/code\u003e (stage 1, below) lives in \u003ccode\u003eocean-prep\u003c/code\u003e\u003c/strong\u003e, alongside\n\u003ccode\u003ebc-correct\u003c/code\u003e/\u003ccode\u003ebc-diagnostics\u003c/code\u003e — install and run it from the \u003ccode\u003eocean-prep\u003c/code\u003e\nrepo (\u003ccode\u003ecli/river_projection.py\u003c/code\u003e), with its config at\n\u003ccode\u003eocean-prep/config/river_projection_example.yaml\u003c/code\u003e. \u003ccode\u003eriver-diagnostics\u003c/code\u003e\n(stage 2) stays in \u003ccode\u003eocean-post\u003c/code\u003e. Confirmed 2026-10-07; this page previously\nreferenced a \u003ccode\u003econfig/river_projection.yaml\u003c/code\u003e in \u003ccode\u003eocean-post\u003c/code\u003e that was never\nthere, and the real tool and config were found in \u003ccode\u003eocean-prep\u003c/code\u003e instead. No\nproject-specific copy of the config exists yet in this checkout — the only\none found is \u003ccode\u003eocean-prep\u003c/code\u003e\u0026rsquo;s own example.\u003c/p\u003e","title":"River Flow and Nutrient Load Projection"},{"content":"update-from-remote Guide Overview update-from-remote is a one-command post-simulation pipeline. After a model run finishes on a remote machine and the analysis scripts have written their outputs there, this command:\nsync — rsyncs the remote analyses/ tree to the local machine merge — flushes staging YAML records into simulation_list.db scan — registers any experiments found on the filesystem but not yet in the DB report — regenerates all Hugo pages via ocean-reporting deploy — builds and pushes the Hugo site to gh-pages (only with --deploy) Both REMOTE and LOCAL_ANALYSES are required positional arguments. There are no defaults, which prevents accidentally syncing into the wrong directory.\nBasic usage # Safe first run: dry-run sync, all other steps shown but skipped update-from-remote kb@myhost:/data/analyses/ ./analyses # Sync + merge + report (no deploy) update-from-remote kb@myhost:/data/analyses/ ./analyses --apply # Full pipeline: sync + merge + report + deploy to gh-pages update-from-remote kb@myhost:/data/analyses/ ./analyses --apply --deploy # Sync + merge + report + local preview update-from-remote kb@myhost:/data/analyses/ ./analyses --apply --serve # Skip sync (only re-run report/deploy from existing local data) update-from-remote kb@myhost:/data/analyses/ ./analyses --no-sync --apply # Dry-run everything: print all commands without executing any update-from-remote kb@myhost:/data/analyses/ ./analyses --dry-run Options Flag Description REMOTE Remote analyses path, e.g. kb@myhost:/data/analyses/ LOCAL_ANALYSES Local analyses directory, e.g. ./analyses --apply Actually execute each step (default: sync shows diff, others are skipped) --dry-run Print all commands without executing any step --no-sync Skip the rsync step --no-report Skip the ocean-reporting step --deploy After reporting, build and push Hugo to gh-pages --serve After reporting, start a local Hugo preview server --hugo-dir DIR Path to Hugo site directory --ssh KEY SSH private key for rsync (-i flag) \u0026ndash;apply vs \u0026ndash;dry-run Without --apply, only the rsync step runs (in dry-run mode) so you can see what would transfer. All other steps (merge, scan, report, deploy) are printed but skipped.\nWith --apply, all steps execute. The deploy or serve step only runs if reporting succeeds.\n--dry-run overrides everything: no step executes at all, only the commands are printed.\nSync behaviour The sync uses manage-analyses sync internally, which only transfers files that conform to the canonical analyses/ layout. Old-layout artefacts at incorrect directory depths are excluded automatically. See guides/manage-analyses.md for details.\nDeploy The deploy step requires deploy_ghpages.py at the repository root. It builds the Hugo site and force-pushes the gh-pages branch. Only runs if:\n--deploy is passed --apply is passed the reporting step succeeded Serve --serve starts hugo server on a free local port after reporting. Useful for reviewing the updated site before deploying. Cannot be combined with --deploy.\nTypical workflow # 1. Model run finishes on the cluster # 2. Check what would sync (safe, no data moved) update-from-remote kb@cluster:/scratch/analyses/ ./analyses # 3. Sync + report locally update-from-remote kb@cluster:/scratch/analyses/ ./analyses --apply # 4. Review at http://localhost:1313 update-from-remote kb@cluster:/scratch/analyses/ ./analyses \\ --no-sync --apply --serve # 5. Deploy when satisfied update-from-remote kb@cluster:/scratch/analyses/ ./analyses \\ --no-sync --apply --deploy ","permalink":"https://bolding-bruggeman.com/oceanicu_3d/guides/update-from-remote/","summary":"\u003ch1 id=\"update-from-remote-guide\"\u003eupdate-from-remote Guide\u003c/h1\u003e\n\u003ch2 id=\"overview\"\u003eOverview\u003c/h2\u003e\n\u003cp\u003e\u003ccode\u003eupdate-from-remote\u003c/code\u003e is a one-command post-simulation pipeline.  After a model\nrun finishes on a remote machine and the analysis scripts have written their\noutputs there, this command:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\u003cstrong\u003esync\u003c/strong\u003e — rsyncs the remote \u003ccode\u003eanalyses/\u003c/code\u003e tree to the local machine\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003emerge\u003c/strong\u003e — flushes staging YAML records into \u003ccode\u003esimulation_list.db\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003escan\u003c/strong\u003e — registers any experiments found on the filesystem but not yet in the DB\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003ereport\u003c/strong\u003e — regenerates all Hugo pages via \u003ccode\u003eocean-reporting\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003edeploy\u003c/strong\u003e — builds and pushes the Hugo site to gh-pages (only with \u003ccode\u003e--deploy\u003c/code\u003e)\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eBoth \u003ccode\u003eREMOTE\u003c/code\u003e and \u003ccode\u003eLOCAL_ANALYSES\u003c/code\u003e are required positional arguments.  There are\nno defaults, which prevents accidentally syncing into the wrong directory.\u003c/p\u003e","title":"Update From Remote"},{"content":"manage-analyses Guide Overview manage-analyses is the housekeeping tool for the analyses/ output tree. All subcommands default to a dry run — add --apply to actually execute.\nSubcommand Purpose clean Remove files at the wrong directory depth (non-canonical layout) wipe Remove all regeneratable outputs so scripts can be re-run from scratch sync Rsync the remote analyses tree to a local directory import-stats Import existing CSV statistics files into statistics.db clean Removes files that do not conform to the canonical layout — for example, plots written directly under validations/\u0026lt;experiment\u0026gt;/plots/ instead of the correct plots/\u0026lt;domain\u0026gt;/\u0026lt;model\u0026gt;/\u0026lt;period\u0026gt;/\u0026lt;type\u0026gt;/ path. Canonical files are left untouched.\n# Preview what would be removed manage-analyses clean # Remove non-conforming files manage-analyses clean --apply Run clean after migrating from an older layout version to sweep up any residual artefacts that fix_analyses_layout moved but did not delete.\nwipe Removes all regeneratable outputs — PNG plots and statistics files — from the entire analyses tree so that all validation scripts can be re-run cleanly.\nNon-regeneratable content is never touched:\n.md narrative files (hand-written area descriptions, experiment notes) metadata.yaml simulation_list.db and staging/ # Preview what would be removed manage-analyses wipe # Wipe all regeneratable outputs manage-analyses wipe --apply Regeneratable patterns removed by wipe:\n*_validation_statistics.txt *_3d_validation_statistics.txt *_profile_validation_statistics.txt *_tidal_statistics.txt *_tidal_detailed_statistics.txt *_scenario_statistics.txt gesla_station_comparison.csv station_comparison.csv *_validation_statistics.csv *_trends.txt **/*.png sync Rsyncs the remote analyses tree to a local directory. Only files that conform to the canonical layout are transferred; old-layout artefacts at the wrong directory depth are automatically excluded via rsync filter rules.\n# Dry-run sync (shows what would transfer — safe to run first) manage-analyses sync kb@remote:/data/analyses/ # Actual sync manage-analyses sync kb@remote:/data/analyses/ --apply # Sync to a specific local directory manage-analyses sync kb@remote:/data/analyses/ \\ --analyses-dir /data/local/analyses --apply # Print the rsync command only (for manual inspection or tweaking) manage-analyses sync kb@remote:/data/analyses/ --print-cmd # Use a specific SSH key manage-analyses sync kb@remote:/data/analyses/ --apply --ssh ~/.ssh/id_rsa update-from-remote calls manage-analyses sync internally. Use manage-analyses sync directly when you want to sync without triggering the full report/deploy pipeline.\nimport-stats Walks the analyses/ tree for all *_validation_statistics.csv files and upserts their rows into analyses/statistics.db. This is a one-off migration for results produced before the database was introduced; new runs populate the database automatically.\n# Preview what would be imported (dry run) manage-analyses import-stats # Actually import manage-analyses import-stats --apply The importer infers area, experiment, domain, and model from the file\u0026rsquo;s directory path. See the Statistics Database guide for details on the schema and how to query the database.\n\u0026ndash;analyses-dir All subcommands accept --analyses-dir DIR to set the local analyses root. There is no ./analyses fallback: when omitted, the root is expanded from OCEANICU_ANALYSES_FOLDER in this machine\u0026rsquo;s data-roots file (\u0026lt;hostname\u0026gt;_ocean-post_data_roots.yaml). If neither is set, the command stops with an error naming the missing variable — wipe in particular is destructive, so it never guesses a directory from the current path.\nCanonical layout reminder The canonical layout that clean and sync enforce (defined in lib/layout.py):\n\u0026lt;analyses_dir\u0026gt;/areas/\u0026lt;AREA\u0026gt;/validations/\u0026lt;EXPERIMENT\u0026gt;/ plots/\u0026lt;domain\u0026gt;/\u0026lt;model\u0026gt;/\u0026lt;period\u0026gt;/\u0026lt;type\u0026gt;/ tables/\u0026lt;domain\u0026gt;/\u0026lt;model\u0026gt;/\u0026lt;type\u0026gt;/ Where:\n\u0026lt;domain\u0026gt; is physics or bio \u0026lt;model\u0026gt; is the model name, e.g. pyGETM \u0026lt;period\u0026gt; is a year (2020) or a range (2015-2022) \u0026lt;type\u0026gt; is surface, bottom, 3d, argo, tidal, wod, cruise, platform, ices, or a depth slice like 0050m \u0026lt;EXPERIMENT\u0026gt; itself can be a single name (the legacy layout, still used by NS and AMM7) or \u0026lt;SOURCE\u0026gt;/\u0026lt;experiment\u0026gt; — e.g. CMEMS/tidal, CMIP6_raw/GFDL-ESM4-ssp126/run01 (NSe\u0026rsquo;s layout, selected via --source on the validation scripts). Both forms are recognised by discovery and by clean/sync; see sources.yaml and the tidal/gridded guides for how the --source form is produced.\n","permalink":"https://bolding-bruggeman.com/oceanicu_3d/guides/manage-analyses/","summary":"\u003ch1 id=\"manage-analyses-guide\"\u003emanage-analyses Guide\u003c/h1\u003e\n\u003ch2 id=\"overview\"\u003eOverview\u003c/h2\u003e\n\u003cp\u003e\u003ccode\u003emanage-analyses\u003c/code\u003e is the housekeeping tool for the \u003ccode\u003eanalyses/\u003c/code\u003e output tree.\nAll subcommands default to a \u003cstrong\u003edry run\u003c/strong\u003e — add \u003ccode\u003e--apply\u003c/code\u003e to actually execute.\u003c/p\u003e\n\u003ctable\u003e\n  \u003cthead\u003e\n      \u003ctr\u003e\n          \u003cth\u003eSubcommand\u003c/th\u003e\n          \u003cth\u003ePurpose\u003c/th\u003e\n      \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003eclean\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003eRemove files at the wrong directory depth (non-canonical layout)\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003ewipe\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003eRemove all regeneratable outputs so scripts can be re-run from scratch\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003esync\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003eRsync the remote analyses tree to a local directory\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003eimport-stats\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003eImport existing CSV statistics files into \u003ccode\u003estatistics.db\u003c/code\u003e\u003c/td\u003e\n      \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch2 id=\"clean\"\u003eclean\u003c/h2\u003e\n\u003cp\u003eRemoves files that do not conform to the canonical layout — for example, plots\nwritten directly under \u003ccode\u003evalidations/\u0026lt;experiment\u0026gt;/plots/\u003c/code\u003e instead of the correct\n\u003ccode\u003eplots/\u0026lt;domain\u0026gt;/\u0026lt;model\u0026gt;/\u0026lt;period\u0026gt;/\u0026lt;type\u0026gt;/\u003c/code\u003e path.  Canonical files are left\nuntouched.\u003c/p\u003e","title":"Manage Analyses"},{"content":"Simulation List Guide Overview simulation-list manages the experiment registry — a SQLite database that tracks every analysis run, its parameters, and its status. The registry is used by ocean-reporting to populate the Hugo site and by update-from-remote after each sync.\nThe registry uses a two-step write pattern to avoid race conditions when multiple analysis scripts run in parallel:\nEach script writes a small staging YAML file under analyses/staging/. simulation-list merge atomically flushes all staging files into the DB. Subcommands # Show DB contents and pending staging files simulation-list status [--base-dir DIR] # Flush staging → DB simulation-list merge [--base-dir DIR] # Export DB to a human-readable YAML snapshot simulation-list to-yaml out.yaml [--base-dir DIR] # Migrate a legacy YAML registry into the DB simulation-list to-sqlite old_registry.yaml [--base-dir DIR] --base-dir defaults to ./analyses.\nTypical use After a validation run, staging files accumulate in analyses/staging/. Merge them into the DB:\nsimulation-list status # see what is pending simulation-list merge # flush into DB simulation-list status # confirm all merged update-from-remote calls merge automatically as part of its pipeline.\nstatus output === Simulation Registry === Database : ./analyses/simulation_list.db Staging : 3 pending records Experiments (2): NS / Baseline active 2015–2022 NS / ObsKd active 2015–2022 Analyses (14): NS / Baseline / gridded_2d_surface … NS / Baseline / argo … … staging/ files Each staging file is a small YAML named by a content hash:\nanalyses/staging/ a3f7c2b1.yaml d8e01fa4.yaml A typical staging file:\nid: a3f7c2b1 area: NS experiment: Baseline analysis_type: argo period: \u0026#34;2015–2022\u0026#34; source: argo_ifremer parameters: TEMP,PSAL,DOXY n_profiles: 12458 n_obs: 487321 created: \u0026#34;2025-04-15T14:32:10\u0026#34; The content hash ensures that re-running the same analysis produces the same file name, preventing duplicate entries in the DB.\nExporting and migrating # Snapshot the current DB to a YAML file (for inspection or backup) simulation-list to-yaml snapshot_2025.yaml # Migrate from the old YAML-based registry format simulation-list to-sqlite old_simulation_list.yaml The to-sqlite command writes each analysis as a staging file rather than directly into the DB, so you can review the result with status before committing with merge.\nProgrammatic access from lib.simulation_list_db import SimulationList sl = SimulationList(base_dir=\u0026#39;./analyses\u0026#39;) # Write a staging record from a validation script sl.update_analysis( area=\u0026#39;NS\u0026#39;, experiment=\u0026#39;Baseline\u0026#39;, analysis_type=\u0026#39;argo\u0026#39;, period=\u0026#39;2015-2022\u0026#39;, n_profiles=12458, n_obs=487321, ) sl.save() # writes staging/\u0026lt;hash\u0026gt;.yaml # Merge all pending staging records sl.merge() # Query the DB experiments = sl.list_experiments() analyses = sl.list_analyses() ","permalink":"https://bolding-bruggeman.com/oceanicu_3d/guides/simulation-list/","summary":"\u003ch1 id=\"simulation-list-guide\"\u003eSimulation List Guide\u003c/h1\u003e\n\u003ch2 id=\"overview\"\u003eOverview\u003c/h2\u003e\n\u003cp\u003e\u003ccode\u003esimulation-list\u003c/code\u003e manages the experiment registry — a SQLite database that\ntracks every analysis run, its parameters, and its status.  The registry is\nused by \u003ccode\u003eocean-reporting\u003c/code\u003e to populate the Hugo site and by \u003ccode\u003eupdate-from-remote\u003c/code\u003e\nafter each sync.\u003c/p\u003e\n\u003cp\u003eThe registry uses a two-step write pattern to avoid race conditions when\nmultiple analysis scripts run in parallel:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eEach script writes a small staging YAML file under \u003ccode\u003eanalyses/staging/\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003esimulation-list merge\u003c/code\u003e atomically flushes all staging files into the DB.\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"subcommands\"\u003eSubcommands\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Show DB contents and pending staging files\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esimulation-list status \u003cspan class=\"o\"\u003e[\u003c/span\u003e--base-dir DIR\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Flush staging → DB\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esimulation-list merge  \u003cspan class=\"o\"\u003e[\u003c/span\u003e--base-dir DIR\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Export DB to a human-readable YAML snapshot\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esimulation-list to-yaml out.yaml \u003cspan class=\"o\"\u003e[\u003c/span\u003e--base-dir DIR\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Migrate a legacy YAML registry into the DB\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esimulation-list to-sqlite old_registry.yaml \u003cspan class=\"o\"\u003e[\u003c/span\u003e--base-dir DIR\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003ccode\u003e--base-dir\u003c/code\u003e defaults to \u003ccode\u003e./analyses\u003c/code\u003e.\u003c/p\u003e","title":"Simulation List"},{"content":"Statistics Database Guide Overview Every analysis script writes its results to human-readable TXT/CSV files inside the analyses/ tree and records the same numbers in a SQLite database at analyses/statistics.db. The database makes it easy to compare experiments, track how metrics change over time, and query across areas and variables without parsing text files.\nThe database is managed by lib/stats_db.py.\nTables Table Purpose statistics Core metrics from 2-D gridded, 3-D, and profile analyses monthly_statistics Month-by-month breakdown (child of statistics) tidal_statistics Tidal constituent summary aggregated across stations mle_rankings MLE cross-experiment ranking rows bc_statistics Bias-correction calibration and future-period metrics statistics One row per (area, experiment, variable, period, layer, model, obs_source, depth_label) combination. A UNIQUE constraint on those eight columns means re-running an analysis upserts the row rather than duplicating it.\nKey columns:\narea, experiment, variable, period, layer, model, domain, obs_source, depth_label rmse, bias, mae, correlation, n_points, n_profiles mean_model, mean_obs, std_model, std_obs err_min, err_p05, err_p25, err_median, err_p75, err_p95, err_max run_date, version monthly_statistics Child rows linked to statistics.id via a foreign key. One row per month (1–12) with rmse, bias, mae, correlation.\ntidal_statistics One row per (area, experiment, constituent, model) with aggregate amplitude and phase metrics (amp_bias, amp_rmse, pha_bias, pha_rmse, n_stations).\nmle_rankings One row per (area, experiment, obs_type, variable, model) with mle_value, rank_overall, and run_date.\nbc_statistics One row per (area, experiment, variable, scenario, method, model, domain) with separate columns for the calibration and future periods (cal_bias, cal_rmse, fut_bias, fut_rmse, etc.).\nHow statistics are written The database is populated automatically as analyses run:\nScript / function What it writes cli/gridded_2d_validation.py statistics + monthly_statistics per layer/variable/dataset cli/gridded_3d_validation.py statistics with layer='3d' lib/_profile_utils.py validate_profiles_against_model() statistics per variable + per depth-band cli/mle_comparison.py mle_rankings cli/tidal_analysis.py tidal_statistics per constituent All writes are wrapped in try/except so a database problem never aborts an analysis run.\nMigrating existing results If you have pre-existing statistics files that pre-date the database, use the import-stats subcommand of manage-analyses:\n# Preview what would be imported (dry run) manage-analyses import-stats # Actually import manage-analyses import-stats --apply --analyses-dir is optional here too — see Manage Analyses: \u0026ndash;analyses-dir.\nThe importer walks analyses/ for each experiment\u0026rsquo;s tables/ tree and:\nIf a YAML config file (any *.yaml except metadata.yaml) exists in the experiment directory, reads it for authoritative identity fields — area, experiment, model name, domain. Otherwise infers them from the path. Imports from *_validation_statistics.csv when available (structured, direct). Falls back to parsing the *_validation_statistics.txt or *_profile_validation_statistics.txt template files when no CSV exists (covers profile, 3-D, and older runs that only wrote TXT). Also imports *_tidal_statistics.txt into the tidal_statistics table. CSV always takes priority over TXT when both exist for the same file.\nQuerying the database Python from stats_db import StatsDB from pathlib import Path db = StatsDB.from_analyses_dir(Path(\u0026#34;analyses\u0026#34;)) # All surface-temperature rows for area NS, sorted by RMSE df = db.get_ranking(\u0026#34;NS\u0026#34;, variable=\u0026#34;TEMP\u0026#34;, layer=\u0026#34;surface\u0026#34;) print(df[[\u0026#34;experiment\u0026#34;, \u0026#34;model\u0026#34;, \u0026#34;rmse\u0026#34;, \u0026#34;bias\u0026#34;, \u0026#34;n_points\u0026#34;]]) # All statistics for one experiment df = db.get_statistics(area=\u0026#34;NS\u0026#34;, experiment=\u0026#34;Baseline\u0026#34;) # MLE rankings df = db.get_mle_rankings(area=\u0026#34;NS\u0026#34;) # Tidal constituents df = db.get_tidal_stats(area=\u0026#34;NS\u0026#34;, experiment=\u0026#34;Baseline\u0026#34;) SQL (sqlite3 CLI) sqlite3 analyses/statistics.db -- List all experiments in the database SELECT DISTINCT area, experiment FROM statistics ORDER BY area, experiment; -- Best RMSE per experiment for SST surface SELECT experiment, model, rmse, bias, n_points FROM statistics WHERE area=\u0026#39;NS\u0026#39; AND variable=\u0026#39;SST\u0026#39; AND layer=\u0026#39;surface\u0026#39; ORDER BY rmse; -- Monthly RMSE for one row SELECT m.month, m.rmse, m.bias FROM monthly_statistics m JOIN statistics s ON m.stat_id = s.id WHERE s.area=\u0026#39;NS\u0026#39; AND s.experiment=\u0026#39;Baseline\u0026#39; AND s.variable=\u0026#39;TEMP\u0026#39; ORDER BY m.month; Database location and remote/local workflow The database lives at \u0026lt;output.base_dir\u0026gt;/statistics.db on whichever machine runs the analysis scripts — normally the remote simulation host.\nRemote machine: analyses/statistics.db ← populated by every analysis run ↓ manage-analyses sync (or update-from-remote) Local machine: analyses/statistics.db ← synced copy; used by ocean-reporting The rsync rules include statistics.db, so it is transferred automatically. If multiple remote machines contribute to the same analyses tree (different areas or experiments on different hosts), run manage-analyses sync from each host in turn — because DB writes use INSERT … ON CONFLICT … DO UPDATE, the last sync wins for any row that appears on more than one remote. Rows from different areas/experiments never conflict and accumulate safely.\nmanage-analyses wipe leaves statistics.db untouched — it is treated like simulation_list.db as accumulated state rather than a regeneratable output.\nConcurrency StatsDB uses WAL journal mode and a per-instance threading lock. Multiple Python threads in the same process can share one StatsDB instance safely. Concurrent processes (e.g. parallel run-validation steps) are also safe because SQLite WAL allows one writer and multiple readers simultaneously.\n","permalink":"https://bolding-bruggeman.com/oceanicu_3d/guides/statistics-db/","summary":"\u003ch1 id=\"statistics-database-guide\"\u003eStatistics Database Guide\u003c/h1\u003e\n\u003ch2 id=\"overview\"\u003eOverview\u003c/h2\u003e\n\u003cp\u003eEvery analysis script writes its results to human-readable TXT/CSV files inside\nthe \u003ccode\u003eanalyses/\u003c/code\u003e tree \u003cstrong\u003eand\u003c/strong\u003e records the same numbers in a SQLite database at\n\u003ccode\u003eanalyses/statistics.db\u003c/code\u003e.  The database makes it easy to compare experiments,\ntrack how metrics change over time, and query across areas and variables without\nparsing text files.\u003c/p\u003e\n\u003cp\u003eThe database is managed by \u003ccode\u003elib/stats_db.py\u003c/code\u003e.\u003c/p\u003e\n\u003ch2 id=\"tables\"\u003eTables\u003c/h2\u003e\n\u003ctable\u003e\n  \u003cthead\u003e\n      \u003ctr\u003e\n          \u003cth\u003eTable\u003c/th\u003e\n          \u003cth\u003ePurpose\u003c/th\u003e\n      \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003estatistics\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003eCore metrics from 2-D gridded, 3-D, and profile analyses\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003emonthly_statistics\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003eMonth-by-month breakdown (child of \u003ccode\u003estatistics\u003c/code\u003e)\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003etidal_statistics\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003eTidal constituent summary aggregated across stations\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003emle_rankings\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003eMLE cross-experiment ranking rows\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003ebc_statistics\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003eBias-correction calibration and future-period metrics\u003c/td\u003e\n      \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch3 id=\"statistics\"\u003estatistics\u003c/h3\u003e\n\u003cp\u003eOne row per \u003cem\u003e(area, experiment, variable, period, layer, model, obs_source,\ndepth_label)\u003c/em\u003e combination.  A \u003ccode\u003eUNIQUE\u003c/code\u003e constraint on those eight columns means\nre-running an analysis \u003cstrong\u003eupserts\u003c/strong\u003e the row rather than duplicating it.\u003c/p\u003e","title":"Statistics Database"},{"content":"Reporting Guide Overview ocean-reporting reads the analyses/ directory tree produced by the validation scripts and generates two types of output:\nHugo Markdown pages — a structured static website showing plots, statistics tables, and summary text for every area and experiment. PDF report — a self-contained document with the same content, built with reportlab. Both outputs can be produced in a single run by combining --hugo and --pdf.\nPrerequisite: the analyses/ tree All validation scripts write to a canonical tree under output.analyses_dir (resolved from OCEANICU_ANALYSES_FOLDER — see the tidal/gridded guides). The exact layout is defined in lib/layout.py:\n\u0026lt;analyses_dir\u0026gt;/ ├── areas/ │ └── \u0026lt;AREA\u0026gt;/ │ ├── *.md ← hand-written prose, merged onto the area page │ └── validations/ │ └── \u0026lt;EXPERIMENT\u0026gt;/ │ ├── plots/ │ │ └── \u0026lt;domain\u0026gt;/ ← physics | bio │ │ └── \u0026lt;model\u0026gt;/ ← e.g. pyGETM │ │ └── \u0026lt;period\u0026gt;/ ← e.g. 2016 | 2016-2023 │ │ └── \u0026lt;type\u0026gt;/ ← surface | argo | tidal | wod | ices | … │ │ └── *.png │ └── tables/ │ └── \u0026lt;domain\u0026gt;/ │ └── \u0026lt;model\u0026gt;/ │ └── \u0026lt;type\u0026gt;/ │ └── *_statistics.txt └── experiments/experiment_registry.sqlite ← simulation registry (optional) \u0026lt;EXPERIMENT\u0026gt; is either a single name (the legacy layout, still used by NS and AMM7) or \u0026lt;SOURCE\u0026gt;/\u0026lt;experiment\u0026gt; — NSe\u0026rsquo;s layout, produced by running the validation scripts with --source. Both are discovered the same way.\nRecognised \u0026lt;type\u0026gt; values: surface, bottom, 3d, argo, glodap, wod, cruise, ices, platform, tidal, scenario, and depth-slice names like 0050m.\nThe reporter discovers areas and experiments by walking this tree, and classifies each experiment by its \u0026lt;type\u0026gt; directory name into one of four buckets: tidal, scenario, mle_comparison (a flat mle_comparison/ folder by name), or validation (everything else — surface, bottom, 3d, argo, wod, cruise, ices, platform). No additional config is needed.\nBasic usage # All areas → Hugo ocean-reporting --analyses-dir ./analyses --recursive \\ --hugo /path/to/hugo/ # Single area → Hugo ocean-reporting --analyses-dir ./analyses --area NS \\ --hugo /path/to/hugo/ # Single experiment → Hugo ocean-reporting --analyses-dir ./analyses --area NS \\ --experiment Baseline --hugo /path/to/hugo/ # All areas → PDF ocean-reporting --analyses-dir ./analyses --recursive \\ --pdf report.pdf # Single area → PDF ocean-reporting --analyses-dir ./analyses --area NS \\ --pdf NS_report.pdf # Both outputs in one run ocean-reporting --analyses-dir ./analyses --recursive \\ --hugo /path/to/hugo/ --pdf report.pdf Options Flag Description --analyses-dir DIR Root of the analyses tree (default: auto-detect by walking up from cwd for a folder named analyses/setups) --area NAME Process only this area. Repeatable (--area NSe --area AMM7). Omit to process every area. --experiment NAME Process only this experiment --recursive Process all areas/experiments under the directory --hugo DIR Write Hugo Markdown pages to this directory --pdf FILE Write a PDF report to this file --db FILE Path to the simulation registry (default: \u0026lt;analyses-dir\u0026gt;/simulation_list.db if it exists) --area on a --recursive run is a publish allowlist, not just a filter. Any area not named prunes its already-published content//static/ pages — it is removed, not merely skipped. This is how regenerate_hugo.py\u0026rsquo;s enabled_areas list (in regen_hosts.yaml) controls which areas are actually live on the site; see the Hugo deployment guide.\nHugo output structure Pages are written flat under the Hugo content directory, one Markdown file per experiment, named \u0026lt;area\u0026gt;-\u0026lt;experiment\u0026gt; with / and _ in the experiment label turned into - (see validation_slug() in lib/layout.py):\nhugo/content/ ├── _index.md ├── areas/ │ ├── _index.md │ ├── nse-boundaries.md │ └── amm7.md ├── validations/ │ ├── _index.md │ ├── nse-overview.md │ ├── nse-cmems-tidal.md ← area=NSe, experiment=CMEMS/tidal │ ├── nse-woa-tidal.md │ └── ns-baseline.md ← legacy, flat experiment name └── scenarios/ └── simulations/ └── nse-cmip6-raw-gfdl-esm4-ssp126-run01/ └── _index.md Static assets (PNG plots, tables) are served from the Hugo static/ tree and linked from the Markdown pages automatically.\nPDF output The PDF contains a table of contents, one section per area and experiment, with embedded figures and statistics tables. It uses the reportlab library. If reportlab is not installed the --pdf flag raises an error with install instructions.\nHow experiment type is detected FlexibleReportingManager._detect_experiment_type() walks the experiment directory via AnalysesLayout.iter_table_dirs/iter_plot_dirs — it reads known layout positions, not filenames — and returns the first match:\n\u0026lt;type\u0026gt; directory found Type detected folder literally named mle_comparison mle_comparison tidal tidal scenario scenario anything else (surface, bottom, 3d, argo, wod, cruise, ices, platform, a depth slice) validation If an experiment directory contains results of multiple \u0026lt;type\u0026gt;s under validation (e.g. surface and 3d), all of them are reported on the one experiment page.\nArea-level .md files — geographic description Each area directory (\u0026lt;analyses_dir\u0026gt;/areas/\u0026lt;AREA\u0026gt;/) may contain one or more hand-written .md files with a description of the geographic domain. The reporter includes this text verbatim at the top of the area\u0026rsquo;s Hugo page and PDF section. Example:\n--- title: North Sea coordinates: [lon_min: -5, lon_max: 12, lat_min: 50, lat_max: 62] --- The North Sea is a shallow shelf sea bounded by the British Isles to the west, Scandinavia to the east, and the English Channel to the south. It is strongly influenced by Atlantic inflow through the Norwegian Trench and by riverine input from the Rhine and Elbe. Automating the full pipeline update-from-remote wraps the reporting step as part of a larger pipeline: sync → merge → report → deploy. See guides/update-from-remote.md.\n","permalink":"https://bolding-bruggeman.com/oceanicu_3d/guides/reporting/","summary":"\u003ch1 id=\"reporting-guide\"\u003eReporting Guide\u003c/h1\u003e\n\u003ch2 id=\"overview\"\u003eOverview\u003c/h2\u003e\n\u003cp\u003e\u003ccode\u003eocean-reporting\u003c/code\u003e reads the \u003ccode\u003eanalyses/\u003c/code\u003e directory tree produced by the validation\nscripts and generates two types of output:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eHugo Markdown pages\u003c/strong\u003e — a structured static website showing plots, statistics\ntables, and summary text for every area and experiment.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003ePDF report\u003c/strong\u003e — a self-contained document with the same content, built with\nreportlab.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eBoth outputs can be produced in a single run by combining \u003ccode\u003e--hugo\u003c/code\u003e and \u003ccode\u003e--pdf\u003c/code\u003e.\u003c/p\u003e\n\u003ch2 id=\"prerequisite-the-analyses-tree\"\u003ePrerequisite: the analyses/ tree\u003c/h2\u003e\n\u003cp\u003eAll validation scripts write to a canonical tree under \u003ccode\u003eoutput.analyses_dir\u003c/code\u003e\n(resolved from \u003ccode\u003eOCEANICU_ANALYSES_FOLDER\u003c/code\u003e — see the tidal/gridded guides).\nThe exact layout is defined in \u003ccode\u003elib/layout.py\u003c/code\u003e:\u003c/p\u003e","title":"Reporting"},{"content":"Hugo Deployment Guide Overview Reporting explains ocean-reporting\u0026rsquo;s options and the analyses/ tree it reads. This guide is about what happens after that: getting the generated Hugo content actually live, and the real mistakes that have already happened doing it.\nThere are two entry points to the exact same underlying code — pick whichever fits the situation:\nupdate-from-remote — sync a remote cluster\u0026rsquo;s analyses/ down, merge/scan into the DB, then report + deploy, all in one command. Right when there\u0026rsquo;s fresh data to pull in first. Manual two-step (used directly against data that\u0026rsquo;s already local, e.g. on the reporting host itself): the calling project\u0026rsquo;s own regenerate_hugo.py --apply, then this repo\u0026rsquo;s own deploy_ghpages.py --apply. Both relay over ssh to the reporting host automatically if run from elsewhere. regenerate_hugo.py isn\u0026rsquo;t part of this repo — it lives in the site\u0026rsquo;s own repo (e.g. oceanicu_3d/regenerate_hugo.py), and its own docs/web-regeneration.md has the full detail for that side. Either path ends up calling cli.reporting:main (as ocean-reporting in one case, python3 -m cli.reporting in the other) and this repo\u0026rsquo;s own deploy_ghpages.py directly. A bug or fix in lib/reporting.py affects both equally.\ndeploy_ghpages.py\u0026rsquo;s actual behavior — read before assuming It builds Hugo into its own throwaway temp directory (an explicit --destination, which overrides whatever publishDir says in the site\u0026rsquo;s Hugo config), then separately checks out gh-pages into a second temp git worktree, copies the build in, commits, and force-pushes from there. This is deliberate (see the script\u0026rsquo;s own docstring) so a stale manual hugo build never leaks into what actually goes live.\nOne consequence worth knowing: the site\u0026rsquo;s own configured publishDir (e.g. \u0026lt;site\u0026gt;/public/) is never touched by this pipeline at all — it\u0026rsquo;s only written by someone manually running plain hugo from the site\u0026rsquo;s Hugo directory. Don\u0026rsquo;t use its mtime as a proxy for whether the live site is current; it can sit stale indefinitely while the real deploys keep happening through the temp-dir path above.\nGenerated content pages: never hand-edit the output Every page _generate_*_page-style functions in lib/reporting.py produce (e.g. _generate_nse_boundaries_page → content/areas/nse-boundaries.md) is written from scratch, every single run, from hardcoded Python string literals plus whatever plot/table files it discovers under analyses/. There is no free-text passthrough mechanism. Hand-editing one of these .md files directly survives exactly until the next report run, then is silently gone — no warning, no diff shown, nothing.\nIf a page needs new prose, a new table, a new section: add it to the generator function itself, not the output file. That change belongs in this repo (lib/reporting.py), even when the content is about something that lives in a different repo entirely (e.g. boundary- condition bias-correction notes for oceanicu_3d) — this repo owns every word that ends up in the generated page.\nA real bug this caused, in case the pattern recurs _generate_scenarios_page crashed with AttributeError: 'BCDiagnosticsLayout' has no attribute 'iter_all_plot_dirs' on every report run since commit 28abad5 (2026-06-23), which moved BCDiagnosticsLayout to ocean-prep as a slimmed-down per- (scenario,model) path builder and, in the process, dropped 4 reporter- side \u0026ldquo;walk the whole scenarios/ tree\u0026rdquo; methods (iter_all_plot_dirs, iter_all_table_dirs, iter_all_river_plot_dirs, iter_all_river_table_dirs) that lib/reporting.py still called.\nThis went unnoticed for three months because generate_hugo() calls its page-generator functions sequentially, and _generate_scenarios_page happens to run after several other pages that write successfully — so per-page output looked fine on casual inspection while the overall script silently exited non-zero every single time. Found and fixed 2026-09-21 (commit e48c882): restored the four walkers verbatim from git show 28abad5 -- lib/layout.py as local functions in lib/reporting.py itself (the on-disk path convention was unchanged since the move — only the discovery logic had been dropped). No test caught this either; tests/test_layout.py never exercised the iter_all_* methods.\nIf a similar \u0026ldquo;AttributeError on some Layout-ish class\u0026rdquo; turns up after a future ocean-prep refactor, check git log -p -- lib/layout.py in this repo first — it\u0026rsquo;s the same class of drift: a class moves out, gets slimmed down for its new home\u0026rsquo;s own needs, and a reporter-side helper that depended on its old, fuller surface silently breaks.\nAnother real bug: slashes in the experiment label broke page slugs NSe\u0026rsquo;s current layout keys experiments as \u0026lt;SOURCE\u0026gt;/\u0026lt;experiment\u0026gt; (CMEMS/tidal, CMIP6_raw/GFDL-ESM4-ssp126/run01 — see Reporting). The page slug used to be f\u0026quot;{area}-{experiment}\u0026quot;.lower(), which kept the / from the experiment label. For CMEMS/tidal that produced the slug nse-cmems/tidal, and writing the page to content/validations/nse-cmems/tidal.md raised FileNotFoundError — nse-cmems/ isn\u0026rsquo;t a directory that exists. The scenario reporter had the same bug in a second form: it keyed scenario pages by area-experiment-scenario_name, but the caller passes the same label as both experiment and scenario_name, so the slug doubled (nse-cmip6_raw/gfdl-esm4-ssp126/run01-cmip6_raw/gfdl-esm4-ssp126/run01) and nested several directories deep.\nFixed 2026-10-06 with one shared helper, validation_slug(area, experiment) in lib/layout.py, used everywhere a page slug is built in lib/tidal_reporting.py and lib/reporting.py; it turns / and _ into -. The scenario case gets its own scenario_slug(area, experiment, scenario_name) in lib/scenario_reporting.py, which drops the scenario part entirely when it repeats the experiment label, instead of doubling it. A stale nested scenario directory left over from the bug had to be removed by hand once (rm -rf content/scenarios/simulations/nse-cmip6_raw) — the generator does not clean up a directory tree it no longer writes to under the old, buggy name.\nIf a page slug ever contains a / or looks doubled again, the experiment or scenario label almost certainly has an unflattened / or _ in it somewhere upstream — check whether the code path still goes through validation_slug()/scenario_slug() rather than building the slug inline.\nenabled_areas in regen_hosts.yaml: a publish allowlist, not a filter The calling project\u0026rsquo;s regen_hosts.yaml (e.g. oceanicu_3d/regen_hosts.yaml) can set enabled_areas — the areas the site actually publishes. This is passed through to cli.reporting\u0026rsquo;s --area as described in Reporting: on a --recursive run, any area not listed has its already-published content//static/ pages actively removed, not left alone. Leaving an area off the list is not \u0026ldquo;not touched yet\u0026rdquo;, it is \u0026ldquo;pruned from the live site\u0026rdquo; — though nothing is lost, since the pages are always regenerated from analyses/ on request. NSe, NS and AMM7 are all enabled as of 2026-10-06; AMM7/ENA4/ENA8/NS had previously been pruned as a side effect of an --area NSe-only regen run before this allowlist existed.\n","permalink":"https://bolding-bruggeman.com/oceanicu_3d/guides/hugo-deployment/","summary":"\u003ch1 id=\"hugo-deployment-guide\"\u003eHugo Deployment Guide\u003c/h1\u003e\n\u003ch2 id=\"overview\"\u003eOverview\u003c/h2\u003e\n\u003cp\u003e\u003ca href=\"reporting.md\"\u003eReporting\u003c/a\u003e explains \u003ccode\u003eocean-reporting\u003c/code\u003e\u0026rsquo;s options and the\n\u003ccode\u003eanalyses/\u003c/code\u003e tree it reads. This guide is about what happens \u003cem\u003eafter\u003c/em\u003e that:\ngetting the generated Hugo content actually live, and the real mistakes\nthat have already happened doing it.\u003c/p\u003e\n\u003cp\u003eThere are two entry points to the exact same underlying code — pick\nwhichever fits the situation:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ca href=\"update-from-remote.md\"\u003eupdate-from-remote\u003c/a\u003e\u003c/strong\u003e — sync a remote\ncluster\u0026rsquo;s \u003ccode\u003eanalyses/\u003c/code\u003e down, merge/scan into the DB, then report +\ndeploy, all in one command. Right when there\u0026rsquo;s fresh data to pull in\nfirst.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eManual two-step\u003c/strong\u003e (used directly against data that\u0026rsquo;s already local,\ne.g. on the reporting host itself): the calling project\u0026rsquo;s own\n\u003ccode\u003eregenerate_hugo.py --apply\u003c/code\u003e, then this repo\u0026rsquo;s own \u003ccode\u003edeploy_ghpages.py --apply\u003c/code\u003e. Both relay over ssh to the reporting host automatically if\nrun from elsewhere. \u003ccode\u003eregenerate_hugo.py\u003c/code\u003e isn\u0026rsquo;t part of this repo — it\nlives in the site\u0026rsquo;s own repo (e.g. \u003ccode\u003eoceanicu_3d/regenerate_hugo.py\u003c/code\u003e),\nand its own \u003ccode\u003edocs/web-regeneration.md\u003c/code\u003e has the full detail for that\nside.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eEither path ends up calling \u003ccode\u003ecli.reporting:main\u003c/code\u003e (as \u003ccode\u003eocean-reporting\u003c/code\u003e in\none case, \u003ccode\u003epython3 -m cli.reporting\u003c/code\u003e in the other) and this repo\u0026rsquo;s own\n\u003ccode\u003edeploy_ghpages.py\u003c/code\u003e directly. A bug or fix in \u003ccode\u003elib/reporting.py\u003c/code\u003e affects\nboth equally.\u003c/p\u003e","title":"Hugo Deployment"},{"content":"All Areas — Experiment Rankings Composite-score ranking pooling experiments from every area together, one chart per validation category, labelled \u0026ldquo;Area: Experiment\u0026rdquo;. Only categories with experiments from two or more areas or runs end up here with a real comparison; see each area’s own rankings page for within-area comparisons.\nTidal Analysis Horizontal Surface Validation Horizontal Bottom Layer Validation Gridded 3D Validation Argo Profile Validation ICES Point Observation Profiles ","permalink":"https://bolding-bruggeman.com/oceanicu_3d/rankings/all/","summary":"\u003ch1 id=\"all-areas--experiment-rankings\"\u003eAll Areas — Experiment Rankings\u003c/h1\u003e\n\u003cp\u003eComposite-score ranking pooling experiments from every area together, one chart per validation category, labelled \u0026ldquo;Area: Experiment\u0026rdquo;. Only categories with experiments from two or more areas or runs end up here with a real comparison; see each area’s own rankings page for within-area comparisons.\u003c/p\u003e\n\u003ch2 id=\"tidal-analysis\"\u003eTidal Analysis\u003c/h2\u003e\n\u003cp\u003e\u003ca id=\"tides\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg alt=\"Tidal experiment ranking\" loading=\"lazy\" src=\"/validations/all-ranking-tides.png\"\u003e\u003c/p\u003e\n\u003ch2 id=\"horizontal-surface-validation\"\u003eHorizontal Surface Validation\u003c/h2\u003e\n\u003cp\u003e\u003ca id=\"horizon-surface\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg alt=\"Salt experiment ranking\" loading=\"lazy\" src=\"/validations/all-ranking-horizon_surface-salt_surface.png\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg alt=\"Temp experiment ranking\" loading=\"lazy\" src=\"/validations/all-ranking-horizon_surface-temp_surface.png\"\u003e\u003c/p\u003e\n\u003ch2 id=\"horizontal-bottom-layer-validation\"\u003eHorizontal Bottom Layer Validation\u003c/h2\u003e\n\u003cp\u003e\u003ca id=\"horizon-bottom\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg alt=\"Salt experiment ranking\" loading=\"lazy\" src=\"/validations/all-ranking-horizon_bottom-salt_bottom.png\"\u003e\u003c/p\u003e","title":"All Areas Rankings"},{"content":"Analysis Overview — all analysis types in one page\nExperiments Baseline — validation CMEMS — validation CMEMS_prof — validation NetSW_LW — validation ObsKd — validation TPXO9 — tidal mle_comparison — mle_comparison Atlantic Margin Model 7 km (AMM7) Domain Description AMM7 is a regional ocean model covering the northwest European continental shelf, from the Iberian Peninsula in the south to the Norwegian Sea in the north. It encompasses the North Sea, English Channel, Celtic Sea, Bay of Biscay, and the shelf break into the northeast Atlantic.\nGeographic Coverage Latitude: 40.1°N to 64.9°N Longitude: 19.8°W to 12.9°E Resolution: ~1/12° spherical grid (~7 km) Vertical: 40 generalised vertical coordinate (GVC) levels Key Features Bathymetry from GEBCO with Beckmann–Haidvogel smoothing Open boundaries driven by CMEMS NWS AMM7 MY reanalysis (historical) or CMIP6 delta-change (future projections) Rivers from EMORID (historic) or CMIP6 (future) Tidal forcing from TPXO9-atlas (13 constituents) Observation Datasets Dataset Variables Period Type ICES hydrographic database Temperature, Salinity 1993– Cruise CTD / bottle ARGO floats (Ifremer/GDAC) Temperature, Salinity 2000– Autonomous profilers OSTIA / CMEMS SST Sea surface temperature 2003– Level 4 satellite analysis FES2014 / TPXO9 Tidal constituents — Barotropic tidal model Cross-experiment Summary Surface 3D How Input Files Were Generated Future ocean boundary conditions use CMIP6 model output as the climate-change signal on top of the historical CMEMS AMM7 reference.\nScenario Summary MPI-ESM1-2-HR\nBoundary type SSP5-8.5 Tidal mean state (2-D) zos, uo, vo 3-D delta-change thetao, so, uo, vo Bathymetry Bathymetry Regridded conservatively from GEBCO onto the AMM7 ~1/12° spherical grid using bathymetry-regrid (ocean-prep), with Beckmann-Haidvogel smoothing (rx0 ≤ 0.2). Output: amm7_topo_getm.nc with variables lon, lat, mask, H.\nAMM7 bathymetry config\nConfig not yet committed.\nbathymetry-regrid --config config/amm7_bathy_create.yaml Boundary Conditions CMEMS historical boundaries (T, S, SSH, currents) NWS AMM7 MY reanalysis (1993–present) providing hourly barotropic and daily baroclinic boundary conditions. Processed with ocean-prep run_cmems_boundaries.\nAMM7 CMEMS boundary config\nConfig not yet committed.\npython cli/run_cmems_boundaries.py --config config/amm7_bdy_create.yaml Tidal boundaries (TPXO9 + CMIP6 mean SSH / barotropic transport) TPXO9-atlas (13 constituents) tidal prediction for zos, uo, vo combined with CMIP6 monthly mean sea-surface height and depth-integrated barotropic transport. Scenario-specific; see Scenario Summary table below.\nAMM7 tidal boundary config\nConfig not yet committed.\nrun-tidal-boundaries --config config/amm7_tidal_bdy.yaml 3-D delta-change boundaries (T, S and optionally currents) Future 3-D boundary conditions via the delta-change method: AMM7 historical CMEMS reference cycled over the output period, with a CMIP6 monthly change signal (future 20-yr climatology minus historical 1985–2014 climatology) added at each boundary point. Scenario-specific; see Scenario Summary table below.\nAMM7 delta-change boundary config\nConfig not yet committed.\nrun-delta-boundaries --config config/amm7_delta_bdy.yaml --scenario ssp585 Initial Conditions Initial conditions (temperature, salinity) Monthly snapshots (1st of each month) from CMEMS NWS AMM7 MY reanalysis. Flood-fill propagates valid values into any remaining NaN cells on the model grid.\nAMM7 initial conditions config\nConfig not yet committed.\npython cli/download_init_conditions.py --config config/amm7_init_create.yaml --source AMM7 --year 2015 ","permalink":"https://bolding-bruggeman.com/oceanicu_3d/areas/amm7/","summary":"AMM7 modeling area — validation results and experiment overview.","title":"AMM7"},{"content":"Horizontal Validation results comparing model output against observations.\nExperiment Information Area: AMM7 Experiment: Baseline Validation Type: Horizontal Validation Variables: SALT_SURFACE, TEMP_SURFACE\nOverview Metric SALT_SURFACE / CCI-SSS TEMP_SURFACE / OSTIA TEMP_SURFACE / CCI-SST RMSE 1.0030 0.9160 0.9018 Bias 0.2756 0.3920 0.3841 Corr 0.6019 0.9651 0.9649 N points 195,106,513 151,821,276 197,655,640 Annual Statistics Trends Salinity (surface) — annual statistics timeseries (RMSE, bias, correlation)\nTemperature (surface) — annual statistics timeseries (RMSE, bias, correlation)\nHorizontal Validation Statistics SALT_SURFACE Metric CCI-SSS RMSE 1.0030 Bias +0.2756 MAE 0.4414 Corr 0.6019 Model mean 35.1719 Obs mean 34.9009 View Full Statistics Report ################################################################################ SALT_SURFACE Validation Statistics ################################################################################ Format: 1.1 Created: 2026-04-30 16:58:50 Author: RT Project: OceanICU Institute: BB Area: AMM7 Experiment: Baseline ################################################################################ ================================================================================ Period: 2016-2023 | Model: pyGETM ================================================================================ Analysed: 2026-04-30 16:58:50 --- CCI-SSS --- RMSE: 1.0030 Bias: +0.2756 MAE: 0.4414 Correlation: 0.6019 N points: 195,106,513 Model mean: 35.1719 Obs mean: 34.9009 Model std: 0.9339 Obs std: 1.1772 Error distribution: Min: -32.4635 5th pct: -0.2833 25th pct: +0.0023 Median: +0.1464 75th pct: +0.3972 95th pct: +1.2992 Max: +16.3415 Monthly breakdown: Month RMSE Bias MAE Corr -------------------------------------------- Jan 0.8386 +0.2295 0.3850 0.6247 Feb 0.9104 +0.2222 0.3944 0.5860 Mar 1.0133 +0.2442 0.4368 0.5628 Apr 1.0604 +0.2677 0.4626 0.5683 May 1.0807 +0.2840 0.4606 0.6037 Jun 1.1435 +0.3240 0.4916 0.6028 Jul 1.1168 +0.3159 0.4775 0.6042 Aug 1.0866 +0.3145 0.4735 0.5962 Sep 1.0521 +0.3070 0.4613 0.5998 Oct 0.9783 +0.2872 0.4341 0.6148 Nov 0.9261 +0.2809 0.4301 0.6060 Dec 0.8481 +0.2275 0.3871 0.6223 -------------------------------------------- All 1.0030 +0.2756 0.4414 0.6019 ================================================================================ Period: 2016 | Model: pyGETM ================================================================================ Analysed: 2026-04-30 16:58:50 --- CCI-SSS --- RMSE: 0.9593 Bias: +0.3249 MAE: 0.4501 Correlation: 0.6329 N points: 24,460,506 Model mean: 35.2095 Obs mean: 34.8875 Model std: 0.8423 Obs std: 1.1664 Error distribution: Min: -25.8268 5th pct: -0.2306 25th pct: +0.0545 Median: +0.1943 75th pct: +0.4087 95th pct: +1.3440 Max: +16.3415 ================================================================================ Period: 2017 | Model: pyGETM ================================================================================ Analysed: 2026-04-30 16:58:50 --- CCI-SSS --- RMSE: 1.0460 Bias: +0.2893 MAE: 0.4306 Correlation: 0.5489 N points: 24,395,369 Model mean: 35.2131 Obs mean: 34.9268 Model std: 0.8926 Obs std: 1.1686 Error distribution: Min: -28.2579 5th pct: -0.2065 25th pct: +0.0251 Median: +0.1375 75th pct: +0.3621 95th pct: +1.3496 Max: +16.3139 ================================================================================ Period: 2018 | Model: pyGETM ================================================================================ Analysed: 2026-04-30 16:58:50 --- CCI-SSS --- RMSE: 0.9921 Bias: +0.2380 MAE: 0.4117 Correlation: 0.5912 N points: 24,338,489 Model mean: 35.1741 Obs mean: 34.9407 Model std: 0.9086 Obs std: 1.1622 Error distribution: Min: -29.9102 5th pct: -0.2936 25th pct: -0.0085 Median: +0.1277 75th pct: +0.3523 95th pct: +1.1403 Max: +15.5873 ================================================================================ Period: 2019 | Model: pyGETM ================================================================================ Analysed: 2026-04-30 16:58:50 --- CCI-SSS --- RMSE: 0.9992 Bias: +0.2882 MAE: 0.4403 Correlation: 0.5874 N points: 24,377,458 Model mean: 35.1845 Obs mean: 34.8998 Model std: 0.8905 Obs std: 1.1549 Error distribution: Min: -28.8293 5th pct: -0.2543 25th pct: +0.0162 Median: +0.1563 75th pct: +0.3962 95th pct: +1.2861 Max: +14.6536 ================================================================================ Period: 2020 | Model: pyGETM ================================================================================ Analysed: 2026-04-30 16:58:50 --- CCI-SSS --- RMSE: 1.0207 Bias: +0.2902 MAE: 0.4547 Correlation: 0.5980 N points: 24,422,636 Model mean: 35.1712 Obs mean: 34.8879 Model std: 0.9276 Obs std: 1.1916 Error distribution: Min: -29.0632 5th pct: -0.2690 25th pct: -0.0063 Median: +0.1350 75th pct: +0.4119 95th pct: +1.3924 Max: +14.6794 ================================================================================ Period: 2021 | Model: pyGETM ================================================================================ Analysed: 2026-04-30 16:58:50 --- CCI-SSS --- RMSE: 1.0191 Bias: +0.2595 MAE: 0.4307 Correlation: 0.6044 N points: 24,370,685 Model mean: 35.1348 Obs mean: 34.8807 Model std: 0.9723 Obs std: 1.2061 Error distribution: Min: -28.0755 5th pct: -0.2896 25th pct: +0.0035 Median: +0.1401 75th pct: +0.3896 95th pct: +1.2146 Max: +15.6121 ================================================================================ Period: 2022 | Model: pyGETM ================================================================================ Analysed: 2026-04-30 16:58:50 --- CCI-SSS --- RMSE: 0.9968 Bias: +0.2628 MAE: 0.4543 Correlation: 0.6181 N points: 24,370,685 Model mean: 35.1515 Obs mean: 34.8939 Model std: 1.0260 Obs std: 1.1594 Error distribution: Min: -32.4635 5th pct: -0.3304 25th pct: -0.0181 Median: +0.1445 75th pct: +0.4339 95th pct: +1.2720 Max: +12.9008 ================================================================================ Period: 2023 | Model: pyGETM ================================================================================ Analysed: 2026-04-30 16:58:50 --- CCI-SSS --- RMSE: 0.9914 Bias: +0.2515 MAE: 0.4584 Correlation: 0.6351 N points: 24,370,685 Model mean: 35.1362 Obs mean: 34.8901 Model std: 0.9941 Obs std: 1.2056 Error distribution: Min: -29.5309 5th pct: -0.3829 25th pct: -0.0531 Median: +0.1321 75th pct: +0.4246 95th pct: +1.3064 Max: +15.3259 📄 Download Statistics Report (txt) · 📄 YAML\nTEMP_SURFACE Metric OSTIA CCI-SST RMSE 0.9160 0.9018 Bias +0.3920 +0.3841 MAE 0.7266 0.7152 Corr 0.9651 0.9649 Model mean 12.2628 12.4600 Obs mean 11.8707 12.0759 View Full Statistics Report ################################################################################ TEMP_SURFACE Validation Statistics ################################################################################ Format: 1.1 Created: 2026-04-30 16:22:30 Author: RT Project: OceanICU Institute: BB Area: AMM7 Experiment: Baseline ################################################################################ ================================================================================ Period: 2016-2023 | Model: pyGETM ================================================================================ Analysed: 2026-04-30 16:22:30 --- OSTIA --- RMSE: 0.9160 Bias: +0.3920 MAE: 0.7266 Correlation: 0.9651 N points: 151,821,276 Model mean: 12.2628 Obs mean: 11.8707 Model std: 4.0162 Obs std: 3.8133 Error distribution: Min: -9.7834 5th pct: -0.8868 25th pct: -0.0976 Median: +0.3996 75th pct: +0.8998 95th pct: +1.6521 Max: +10.0921 Monthly breakdown: Month RMSE Bias MAE Corr -------------------------------------------- Jan 0.9340 +0.3050 0.7263 0.9555 Feb 0.9121 +0.2936 0.6972 0.9589 Mar 0.8415 +0.2331 0.6405 0.9637 Apr 0.7604 +0.1807 0.5835 0.9705 May 0.8391 +0.3735 0.6565 0.9716 Jun 1.2281 +0.7980 0.9955 0.9552 Jul 1.3036 +0.8952 1.0867 0.9534 Aug 1.0455 +0.6093 0.8451 0.9626 Sep 0.7555 +0.2528 0.5822 0.9765 Oct 0.6902 +0.1415 0.5374 0.9778 Nov 0.7899 +0.2486 0.6275 0.9688 Dec 0.9270 +0.3613 0.7343 0.9595 -------------------------------------------- All 0.9160 +0.3920 0.7266 0.9651 --- CCI-SST --- RMSE: 0.9018 Bias: +0.3841 MAE: 0.7152 Correlation: 0.9649 N points: 197,655,640 Model mean: 12.4600 Obs mean: 12.0759 Model std: 3.8903 Obs std: 3.7509 Error distribution: Min: -11.0026 5th pct: -0.8721 25th pct: -0.1136 Median: +0.3811 75th pct: +0.8884 95th pct: +1.6397 Max: +8.8265 Monthly breakdown: Month RMSE Bias MAE Corr -------------------------------------------- Jan 0.8997 +0.2875 0.6939 0.9561 Feb 0.8773 +0.2977 0.6676 0.9598 Mar 0.8263 +0.2625 0.6305 0.9636 Apr 0.7444 +0.2077 0.5751 0.9700 May 0.8260 +0.3887 0.6490 0.9703 Jun 1.1845 +0.7575 0.9614 0.9544 Jul 1.2591 +0.8469 1.0452 0.9536 Aug 1.0436 +0.6036 0.8462 0.9628 Sep 0.7678 +0.2521 0.5932 0.9760 Oct 0.7131 +0.1326 0.5564 0.9766 Nov 0.7939 +0.2235 0.6293 0.9675 Dec 0.9218 +0.3378 0.7267 0.9574 -------------------------------------------- All 0.9018 +0.3841 0.7152 0.9649 ================================================================================ Period: 2016 | Model: pyGETM ================================================================================ Analysed: 2026-04-30 16:22:30 --- OSTIA --- RMSE: 0.8768 Bias: +0.1957 MAE: 0.6889 Correlation: 0.9610 N points: 19,016,628 Model mean: 12.0692 Obs mean: 11.8735 Model std: 3.9886 Obs std: 3.7392 Error distribution: Min: -8.4243 5th pct: -1.0961 25th pct: -0.2904 Median: +0.2150 75th pct: +0.7203 95th pct: +1.4537 Max: +6.9846 --- CCI-SST --- RMSE: 0.8298 Bias: +0.1936 MAE: 0.6514 Correlation: 0.9638 N points: 24,757,704 Model mean: 12.2449 Obs mean: 12.0513 Model std: 3.8616 Obs std: 3.7266 Error distribution: Min: -8.9750 5th pct: -1.0402 25th pct: -0.2701 Median: +0.2129 75th pct: +0.6939 95th pct: +1.3793 Max: +7.1261 ================================================================================ Period: 2017 | Model: pyGETM ================================================================================ Analysed: 2026-04-30 16:22:30 --- OSTIA --- RMSE: 0.8807 Bias: +0.3935 MAE: 0.7007 Correlation: 0.9662 N points: 18,964,670 Model mean: 12.2909 Obs mean: 11.8974 Model std: 3.8412 Obs std: 3.6558 Error distribution: Min: -6.1325 5th pct: -0.8441 25th pct: -0.0802 Median: +0.4026 75th pct: +0.8828 95th pct: +1.6333 Max: +8.6925 --- CCI-SST --- RMSE: 0.8524 Bias: +0.3655 MAE: 0.6785 Correlation: 0.9671 N points: 24,690,059 Model mean: 12.4918 Obs mean: 12.1263 Model std: 3.7457 Obs std: 3.6290 Error distribution: Min: -6.5475 5th pct: -0.8617 25th pct: -0.1087 Median: +0.3653 75th pct: +0.8458 95th pct: +1.5749 Max: +6.7065 ================================================================================ Period: 2018 | Model: pyGETM ================================================================================ Analysed: 2026-04-30 16:22:30 --- OSTIA --- RMSE: 0.9849 Bias: +0.4776 MAE: 0.7812 Correlation: 0.9629 N points: 18,964,670 Model mean: 12.1215 Obs mean: 11.6439 Model std: 4.1821 Obs std: 3.9844 Error distribution: Min: -9.7834 5th pct: -0.8793 25th pct: -0.0494 Median: +0.4812 75th pct: +1.0063 95th pct: +1.8040 Max: +8.3029 --- CCI-SST --- RMSE: 0.9695 Bias: +0.5086 MAE: 0.7647 Correlation: 0.9651 N points: 24,690,050 Model mean: 12.3127 Obs mean: 11.8041 Model std: 4.0178 Obs std: 3.8476 Error distribution: Min: -10.7811 5th pct: -0.7440 25th pct: -0.0015 Median: +0.4971 75th pct: +1.0093 95th pct: +1.8266 Max: +8.2242 ================================================================================ Period: 2019 | Model: pyGETM ================================================================================ Analysed: 2026-04-30 16:22:30 --- OSTIA --- RMSE: 0.9111 Bias: +0.4732 MAE: 0.7328 Correlation: 0.9687 N points: 18,964,670 Model mean: 12.2363 Obs mean: 11.7631 Model std: 3.9060 Obs std: 3.6817 Error distribution: Min: -7.1780 5th pct: -0.7480 25th pct: -0.0108 Median: +0.4761 75th pct: +0.9800 95th pct: +1.6861 Max: +7.3279 --- CCI-SST --- RMSE: 0.9227 Bias: +0.5084 MAE: 0.7423 Correlation: 0.9670 N points: 24,690,060 Model mean: 12.4605 Obs mean: 11.9521 Model std: 3.7935 Obs std: 3.6177 Error distribution: Min: -8.6994 5th pct: -0.6930 25th pct: +0.0024 Median: +0.5044 75th pct: +1.0226 95th pct: +1.7321 Max: +6.9408 ================================================================================ Period: 2020 | Model: pyGETM ================================================================================ Analysed: 2026-04-30 16:22:30 --- OSTIA --- RMSE: 0.8991 Bias: +0.4208 MAE: 0.7118 Correlation: 0.9673 N points: 19,016,628 Model mean: 12.2002 Obs mean: 11.7794 Model std: 3.8771 Obs std: 3.6783 Error distribution: Min: -8.2411 5th pct: -0.8051 25th pct: -0.0540 Median: +0.4241 75th pct: +0.9163 95th pct: +1.6575 Max: +8.3450 --- CCI-SST --- RMSE: 0.8976 Bias: +0.4669 MAE: 0.7145 Correlation: 0.9679 N points: 24,757,704 Model mean: 12.3851 Obs mean: 11.9182 Model std: 3.7680 Obs std: 3.6279 Error distribution: Min: -9.9685 5th pct: -0.7210 25th pct: -0.0109 Median: +0.4606 75th pct: +0.9506 95th pct: +1.6736 Max: +7.1809 ================================================================================ Period: 2021 | Model: pyGETM ================================================================================ Analysed: 2026-04-30 16:22:30 --- OSTIA --- RMSE: 0.9805 Bias: +0.4560 MAE: 0.7747 Correlation: 0.9601 N points: 18,964,670 Model mean: 12.1911 Obs mean: 11.7351 Model std: 4.0802 Obs std: 3.8776 Error distribution: Min: -8.5194 5th pct: -0.8656 25th pct: -0.0653 Median: +0.4509 75th pct: +0.9944 95th pct: +1.8046 Max: +8.3180 --- CCI-SST --- RMSE: 0.9625 Bias: +0.4274 MAE: 0.7556 Correlation: 0.9598 N points: 24,689,971 Model mean: 12.4060 Obs mean: 11.9786 Model std: 3.9558 Obs std: 3.8267 Error distribution: Min: -10.7180 5th pct: -0.8792 25th pct: -0.1153 Median: +0.3999 75th pct: +0.9553 95th pct: +1.7966 Max: +7.8217 ================================================================================ Period: 2022 | Model: pyGETM ================================================================================ Analysed: 2026-04-30 16:22:30 --- OSTIA --- RMSE: 0.8457 Bias: +0.3520 MAE: 0.6691 Correlation: 0.9713 N points: 18,964,670 Model mean: 12.4037 Obs mean: 12.0517 Model std: 4.0073 Obs std: 3.8585 Error distribution: Min: -6.4934 5th pct: -0.8451 25th pct: -0.1163 Median: +0.3536 75th pct: +0.8264 95th pct: +1.5326 Max: +6.9722 --- CCI-SST --- RMSE: 0.8367 Bias: +0.3027 MAE: 0.6635 Correlation: 0.9688 N points: 24,690,060 Model mean: 12.6041 Obs mean: 12.3015 Model std: 3.8767 Obs std: 3.7716 Error distribution: Min: -7.8750 5th pct: -0.9148 25th pct: -0.1883 Median: +0.2948 75th pct: +0.7911 95th pct: +1.5135 Max: +7.0232 ================================================================================ Period: 2023 | Model: pyGETM ================================================================================ Analysed: 2026-04-30 16:22:30 --- OSTIA --- RMSE: 0.9464 Bias: +0.3678 MAE: 0.7539 Correlation: 0.9640 N points: 18,964,670 Model mean: 12.5899 Obs mean: 12.2221 Model std: 4.2069 Obs std: 3.9821 Error distribution: Min: -8.7341 5th pct: -1.0365 25th pct: -0.1473 Median: +0.3920 75th pct: +0.9128 95th pct: +1.6738 Max: +10.0921 --- CCI-SST --- RMSE: 0.9404 Bias: +0.2997 MAE: 0.7511 Correlation: 0.9601 N points: 24,690,032 Model mean: 12.7754 Obs mean: 12.4757 Model std: 4.0655 Obs std: 3.9041 Error distribution: Min: -11.0026 5th pct: -1.1399 25th pct: -0.2606 Median: +0.3086 75th pct: +0.8701 95th pct: +1.6717 Max: +8.8265 📄 Download Statistics Report (txt) · 📄 YAML\nPlots Full Period SALT_SURFACE Salinity (surface) — monthly by year\nSalinity (surface) — monthly statistics\nCCI-SSS Salinity (surface) — CCI-SSS comparison\nSalinity (surface) — CCI-SSS monthly maps\nSalinity (surface) — CCI-SSS monthly taylor\nSalinity (surface) — CCI-SSS pdf annual\nSalinity (surface) — CCI-SSS pdf monthly\nSalinity (surface) — CCI-SSS spatial stats\nTEMP_SURFACE Temperature (surface) — monthly by year CCI-SST\nTemperature (surface) — monthly by year OSTIA\nTemperature (surface) — monthly statistics\nCCI-SST Temperature (surface) — CCI-SST comparison\nTemperature (surface) — CCI-SST monthly maps\nTemperature (surface) — CCI-SST monthly taylor\nTemperature (surface) — CCI-SST pdf annual\nTemperature (surface) — CCI-SST pdf monthly\nTemperature (surface) — CCI-SST spatial stats\nOSTIA Temperature (surface) — OSTIA comparison\nTemperature (surface) — OSTIA monthly maps\nTemperature (surface) — OSTIA monthly taylor\nTemperature (surface) — OSTIA pdf annual\nTemperature (surface) — OSTIA pdf monthly\nTemperature (surface) — OSTIA spatial stats\nTaylor diagram\nGridded 3D Validation Statistics SALT_3D Metric WOA RMSE 0.3919 Bias -0.0277 MAE 0.1981 Corr 0.6007 Model mean 35.2548 Obs mean 35.2825 View Full Statistics Report ################################################################################ SALT Validation Statistics ################################################################################ Format: 1.1 Created: 2026-05-07 08:29:01 Author: RT Project: OceanICU Institute: BB Area: AMM7 Experiment: Baseline ################################################################################ ================================================================================ Period: 2016-2023 | Model: pyGETM ================================================================================ Analysed: 2026-05-07 19:16:30 --- WOA --- RMSE: 0.3919 Bias: -0.0277 MAE: 0.1981 Correlation: 0.6007 N points: 115,638,048 Model mean: 35.2548 Obs mean: 35.2825 Model std: 0.3798 Obs std: 0.4743 Error distribution: Min: -14.4854 5th pct: -0.6332 25th pct: -0.1051 Median: +0.0088 75th pct: +0.1072 95th pct: +0.3166 Max: +14.9160 Monthly breakdown: Month RMSE Bias MAE Corr -------------------------------------------- Jan 0.3221 -0.0210 0.1835 0.6372 Feb 0.3699 -0.0106 0.1941 0.5878 Mar 0.3995 -0.0144 0.1933 0.6024 Apr 0.3947 -0.0258 0.1962 0.6051 May 0.4179 -0.0283 0.2017 0.5929 Jun 0.4413 -0.0385 0.2081 0.5725 Jul 0.4210 -0.0327 0.2098 0.5934 Aug 0.4182 -0.0345 0.2063 0.5841 Sep 0.3742 -0.0381 0.1985 0.6114 Oct 0.4534 -0.0156 0.2118 0.6040 Nov 0.3411 -0.0348 0.1895 0.6370 Dec 0.3212 -0.0377 0.1842 0.6364 -------------------------------------------- All 0.3919 -0.0277 0.1981 0.6007 📄 Download Statistics Report (txt) · 📄 YAML\nTEMP_3D Metric WOA RMSE 2.6073 Bias -1.0462 MAE 1.8039 Corr 0.8408 Model mean 8.1345 Obs mean 9.1808 View Full Statistics Report ################################################################################ TEMP Validation Statistics ################################################################################ Format: 1.1 Created: 2026-05-07 08:00:00 Author: RT Project: OceanICU Institute: BB Area: AMM7 Experiment: Baseline ################################################################################ ================================================================================ Period: 2016-2023 | Model: pyGETM ================================================================================ Analysed: 2026-05-07 18:47:19 --- WOA --- RMSE: 2.6073 Bias: -1.0462 MAE: 1.8039 Correlation: 0.8408 N points: 115,638,048 Model mean: 8.1345 Obs mean: 9.1808 Model std: 4.4103 Obs std: 3.7631 Error distribution: Min: -8.7417 5th pct: -5.7957 25th pct: -2.2220 Median: -0.4773 75th pct: +0.3474 95th pct: +1.9338 Max: +12.5807 Monthly breakdown: Month RMSE Bias MAE Corr -------------------------------------------- Jan 2.5164 -1.1156 1.7042 0.8091 Feb 2.4962 -1.1176 1.6789 0.8018 Mar 2.4812 -1.1143 1.6618 0.7988 Apr 2.4727 -1.1298 1.6499 0.8055 May 2.5160 -1.0494 1.7057 0.8158 Jun 2.7101 -0.8669 1.9320 0.8265 Jul 2.8396 -0.8163 2.0355 0.8463 Aug 2.8265 -0.8624 2.0408 0.8634 Sep 2.7131 -1.0045 1.9416 0.8716 Oct 2.6079 -1.1622 1.8211 0.8674 Nov 2.5519 -1.1486 1.7503 0.8476 Dec 2.5181 -1.1673 1.7247 0.8325 -------------------------------------------- All 2.6073 -1.0462 1.8039 0.8408 📄 Download Statistics Report (txt) · 📄 YAML\nPlots Full Period Salinity at 5 m depth — model vs observations comparison\nSalinity at 5 m depth — spatial distribution of statistics\nSalinity at 50 m depth — model vs observations comparison\nSalinity at 50 m depth — spatial distribution of statistics\nSalinity at 100 m depth — model vs observations comparison\nSalinity at 100 m depth — spatial distribution of statistics\nSalinity at 200 m depth — model vs observations comparison\nSalinity at 200 m depth — spatial distribution of statistics\nSalinity at 500 m depth — model vs observations comparison\nSalinity at 500 m depth — spatial distribution of statistics\nSalinity — monthly 3D profile statistics\nSalinity — monthly 3D Taylor diagram\nTaylor diagram\nTemperature at 5 m depth — model vs observations comparison\nTemperature at 5 m depth — spatial distribution of statistics\nTemperature at 50 m depth — model vs observations comparison\nTemperature at 50 m depth — spatial distribution of statistics\nTemperature at 100 m depth — model vs observations comparison\nTemperature at 100 m depth — spatial distribution of statistics\nTemperature at 200 m depth — model vs observations comparison\nTemperature at 200 m depth — spatial distribution of statistics\nTemperature at 500 m depth — model vs observations comparison\nTemperature at 500 m depth — spatial distribution of statistics\nTemperature — monthly 3D profile statistics\nTemperature — monthly 3D Taylor diagram\nICES Point Profiles Statistics PSAL Metric ICES point observations RMSE 1.0428 Bias +0.2043 MAE 0.3132 Corr 0.6842 Model mean 34.9848 Obs mean 34.7805 View Full Statistics Report ################################################################################ PSAL Profile Validation Statistics ################################################################################ Format: 1.1 Created: 2026-04-30 21:16:02 Area: AMM7 Experiment: Baseline ################################################################################ ================================================================================ Period: 2016-2023 | Model: pyGETM ================================================================================ Analysed: 2026-05-07 07:26:03 --- ICES point observations --- RMSE: 1.0428 Bias: +0.2043 MAE: 0.3132 Correlation: 0.6842 N points: 4,479,562 N profiles: 32,134 Model mean: 34.9848 Obs mean: 34.7805 Model std: 0.7657 Obs std: 1.3806 Error distribution: Min: -34.5193 5th pct: -0.2809 25th pct: -0.0032 Median: +0.0935 75th pct: +0.2111 95th pct: +0.6663 Max: +34.4219 Statistics by depth: Depth N Bias RMSE Corr ------------------------------------------------------ 0-10m 288,164 +1.2476 3.6108 0.5618 10-25m 420,745 +0.4439 1.4158 0.6849 25-50m 567,989 +0.1566 0.5095 0.7681 50-100m 763,824 +0.1100 0.2829 0.8003 100-200m 681,882 +0.0646 0.1713 0.8172 200-500m 782,467 +0.0923 0.1351 0.8450 500-1000m 586,611 +0.0644 0.1334 0.8939 📄 Download Statistics Report (txt) · 📄 YAML\nTEMP Metric ICES point observations RMSE 1.1857 Bias +0.1009 MAE 0.8000 Corr 0.9567 Model mean 7.7389 Obs mean 7.6380 View Full Statistics Report ################################################################################ TEMP Profile Validation Statistics ################################################################################ Format: 1.1 Created: 2026-04-30 21:13:47 Area: AMM7 Experiment: Baseline ################################################################################ ================================================================================ Period: 2016-2023 | Model: pyGETM ================================================================================ Analysed: 2026-05-07 07:24:06 --- ICES point observations --- RMSE: 1.1857 Bias: +0.1009 MAE: 0.8000 Correlation: 0.9567 N points: 4,488,796 N profiles: 28,989 Model mean: 7.7389 Obs mean: 7.6380 Model std: 3.9448 Obs std: 4.0496 Error distribution: Min: -10.1696 5th pct: -1.6426 25th pct: -0.4082 Median: +0.0595 75th pct: +0.6308 95th pct: +2.0384 Max: +9.2800 Statistics by depth: Depth N Bias RMSE Corr ------------------------------------------------------ 0-10m 286,658 +0.3111 1.2264 0.9639 10-25m 422,418 -0.1907 1.4237 0.9271 25-50m 570,518 -0.2559 1.3481 0.8649 50-100m 766,720 +0.0922 0.8780 0.8731 100-200m 684,363 +0.1123 0.7826 0.8729 200-500m 783,657 +0.1348 1.3744 0.8557 500-1000m 586,581 +0.2550 1.2684 0.9583 📄 Download Statistics Report (txt) · 📄 YAML\nPlots Practical Salinity — statistics vs depth profile\nTemperature — statistics vs depth profile\nArgo Float Profiles Statistics PSAL Metric ARGO floats RMSE 4.3342 Bias +0.6646 MAE 0.7583 Corr 0.1743 Model mean 35.3563 Obs mean 34.6917 View Full Statistics Report ################################################################################ PSAL Profile Validation Statistics ################################################################################ Format: 1.1 Created: 2026-05-05 10:00:29 Area: AMM7 Experiment: Baseline ################################################################################ ================================================================================ Period: 2016-2023 | Model: pyGETM ================================================================================ Analysed: 2026-05-05 10:00:29 --- ARGO floats --- RMSE: 4.3342 Bias: +0.6646 MAE: 0.7583 Correlation: 0.1743 N points: 4,905,728 N profiles: 18,473 Model mean: 35.3563 Obs mean: 34.6917 Model std: 0.3082 Obs std: 4.3259 Error distribution: Min: -26.4433 5th pct: -0.2453 25th pct: -0.0128 Median: +0.0608 75th pct: +0.1838 95th pct: +0.4500 Max: +36.8896 Statistics by depth: Depth N Bias RMSE Corr ------------------------------------------------------ 0-10m 97,572 +0.5546 3.2684 0.1719 10-25m 146,016 +0.7025 3.6024 0.1580 25-50m 232,397 +0.7747 3.7305 0.1229 50-100m 425,227 +0.7950 3.8506 0.1004 100-200m 495,254 +0.7208 4.4644 0.1627 200-500m 1,075,494 +0.7137 4.6168 0.2005 500-1000m 1,117,739 +0.6148 4.5117 0.2520 📄 Download Statistics Report (txt) · 📄 YAML\nTEMP Metric ARGO floats RMSE 1.2648 Bias +0.2033 MAE 0.9381 Corr 0.9624 Model mean 8.2875 Obs mean 8.0842 View Full Statistics Report ################################################################################ TEMP Profile Validation Statistics ################################################################################ Format: 1.1 Created: 2026-05-05 09:57:30 Area: AMM7 Experiment: Baseline ################################################################################ ================================================================================ Period: 2016-2023 | Model: pyGETM ================================================================================ Analysed: 2026-05-05 09:57:30 --- ARGO floats --- RMSE: 1.2648 Bias: +0.2033 MAE: 0.9381 Correlation: 0.9624 N points: 4,906,063 N profiles: 18,473 Model mean: 8.2875 Obs mean: 8.0842 Model std: 4.5916 Obs std: 4.4683 Error distribution: Min: -49.6595 5th pct: -1.6005 25th pct: -0.5229 Median: +0.0218 75th pct: +0.9589 95th pct: +2.3211 Max: +20.4119 Statistics by depth: Depth N Bias RMSE Corr ------------------------------------------------------ 0-10m 97,583 +0.4029 1.0456 0.9741 10-25m 146,026 +0.0600 1.1311 0.9573 25-50m 232,410 +0.3038 1.2722 0.9241 50-100m 425,244 +0.7066 1.5131 0.9069 100-200m 495,283 +0.3951 1.4952 0.9112 200-500m 1,075,630 +0.1414 1.3630 0.9361 500-1000m 1,117,875 -0.2909 1.0199 0.9690 📄 Download Statistics Report (txt) · 📄 YAML\nPlots Amm7 Argo Argo Overview\nAMM7_ARGO — Hovmöller diagram\nPractical Salinity — statistics vs depth profile\nTemperature — statistics vs depth profile\nObservations ARGO Observations — 2016-2023 ARGO Station Map\nARGO Observation Density\nARGO Hovmoller\nICES Observations — 2016-2022 ICES Station Map\nICES Observation Density\nICES Alk Hovmoller\nICES Amon Hovmoller\nICES Doxy Hovmoller\nICES Ntra Hovmoller\nICES Ph Hovmoller\nICES Phos Hovmoller\nICES PSAL Hovmoller\nICES Slca Hovmoller\nICES TEMP Hovmoller\nICES Observations — 2016-2023 ICES Station Map\nICES Observation Density\nICES Alk Hovmoller\nICES Amon Hovmoller\nICES Cphl Hovmoller\nICES Doxy Hovmoller\nICES Ntra Hovmoller\nICES Ph Hovmoller\nICES Phos Hovmoller\nICES PSAL Hovmoller\nICES Slca Hovmoller\nICES TEMP Hovmoller\nMethodology Horizontal Validation Model surface fields compared against gridded satellite products and in-situ observations.\nStatistics: RMSE, Bias, MAE, Pearson correlation.\nSpatial statistics show the error distribution across the domain.\nGridded 3D Validation Model vertical profiles compared against gridded 3D climatologies.\nStatistics: RMSE and Bias at each depth level.\nICES Point Profiles Quality-controlled hydrographic profiles from the ICES data portal (temperature, salinity, biogeochemical variables).\nArgo Float Profiles Autonomous profiling floats providing temperature and salinity profiles to 2000 m depth (Ifremer ERDDAP).\n← Back to AMM7 View All Validations →\n","permalink":"https://bolding-bruggeman.com/oceanicu_3d/validations/amm7-baseline/","summary":"\u003cp\u003eHorizontal Validation results comparing model output against observations.\u003c/p\u003e\n\u003ch2 id=\"experiment-information\"\u003eExperiment Information\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eArea\u003c/strong\u003e: AMM7\n\u003cstrong\u003eExperiment\u003c/strong\u003e: Baseline\n\u003cstrong\u003eValidation Type\u003c/strong\u003e: Horizontal Validation\n\u003cstrong\u003eVariables\u003c/strong\u003e: SALT_SURFACE, TEMP_SURFACE\u003c/p\u003e\n\u003ch2 id=\"overview\"\u003eOverview\u003c/h2\u003e\n\u003ctable\u003e\n  \u003cthead\u003e\n      \u003ctr\u003e\n          \u003cth\u003eMetric\u003c/th\u003e\n          \u003cth\u003eSALT_SURFACE / CCI-SSS\u003c/th\u003e\n          \u003cth\u003eTEMP_SURFACE / OSTIA\u003c/th\u003e\n          \u003cth\u003eTEMP_SURFACE / CCI-SST\u003c/th\u003e\n      \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eRMSE\u003c/td\u003e\n          \u003ctd\u003e1.0030\u003c/td\u003e\n          \u003ctd\u003e0.9160\u003c/td\u003e\n          \u003ctd\u003e0.9018\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eBias\u003c/td\u003e\n          \u003ctd\u003e0.2756\u003c/td\u003e\n          \u003ctd\u003e0.3920\u003c/td\u003e\n          \u003ctd\u003e0.3841\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eCorr\u003c/td\u003e\n          \u003ctd\u003e0.6019\u003c/td\u003e\n          \u003ctd\u003e0.9651\u003c/td\u003e\n          \u003ctd\u003e0.9649\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eN points\u003c/td\u003e\n          \u003ctd\u003e195,106,513\u003c/td\u003e\n          \u003ctd\u003e151,821,276\u003c/td\u003e\n          \u003ctd\u003e197,655,640\u003c/td\u003e\n      \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch3 id=\"annual-statistics-trends\"\u003eAnnual Statistics Trends\u003c/h3\u003e\n\u003cp\u003e\u003cimg alt=\"Salinity (surface) — annual statistics timeseries (RMSE, bias, correlation)\" loading=\"lazy\" src=\"/validation-data/amm7-baseline/physics/pyGETM/2016-2023/surface/salt_surface_timeseries_statistics.png\"\u003e\n\u003cem\u003eSalinity (surface) — annual statistics timeseries (RMSE, bias, correlation)\u003c/em\u003e\u003c/p\u003e","title":"AMM7 - Experiment Baseline"},{"content":"Horizontal Validation results comparing model output against observations.\nExperiment Information Area: AMM7 Experiment: CMEMS Validation Type: Horizontal Validation Variables: SALT_SURFACE, TEMP_SURFACE\nOverview Metric SALT_SURFACE / CCI-SSS TEMP_SURFACE / OSTIA TEMP_SURFACE / CCI-SST RMSE 1.0607 1.1413 1.0988 Bias -0.0323 0.6880 0.6777 Corr 0.8367 0.9610 0.9630 N points 195,106,513 151,821,276 197,655,640 Annual Statistics Trends Salinity (surface) — annual statistics timeseries (RMSE, bias, correlation)\nTemperature (surface) — annual statistics timeseries (RMSE, bias, correlation)\nHorizontal Validation Statistics SALT_SURFACE Metric CCI-SSS RMSE 1.0607 Bias -0.0323 MAE 0.4797 Corr 0.8367 Model mean 34.8636 Obs mean 34.9009 View Full Statistics Report ################################################################################ SALT_SURFACE Validation Statistics ################################################################################ Format: 1.1 Created: 2026-05-08 17:11:33 Author: RT Project: OceanICU Institute: BB Area: AMM7 Experiment: CMEMS ################################################################################ ================================================================================ Period: 2016-2023 | Model: pyGETM ================================================================================ Analysed: 2026-05-08 17:11:33 --- CCI-SSS --- RMSE: 1.0607 Bias: -0.0323 MAE: 0.4797 Correlation: 0.8367 N points: 195,106,513 Model mean: 34.8636 Obs mean: 34.9009 Model std: 1.8646 Obs std: 1.1772 Error distribution: Min: -32.4903 5th pct: -1.6169 25th pct: -0.0780 Median: +0.0726 75th pct: +0.3042 95th pct: +0.9452 Max: +12.3821 Monthly breakdown: Month RMSE Bias MAE Corr -------------------------------------------- Jan 0.8388 +0.0465 0.3902 0.8231 Feb 0.8943 +0.0328 0.3982 0.8177 Mar 1.0006 +0.0175 0.4404 0.8135 Apr 1.0966 -0.0119 0.4801 0.8213 May 1.1882 -0.0753 0.5071 0.8507 Jun 1.3549 -0.1180 0.5677 0.8442 Jul 1.3352 -0.1511 0.5715 0.8304 Aug 1.2628 -0.1154 0.5641 0.8259 Sep 1.1832 -0.0716 0.5217 0.8386 Oct 0.9864 -0.0010 0.4560 0.8338 Nov 0.9272 +0.0507 0.4408 0.8239 Dec 0.9134 +0.0137 0.4142 0.8311 -------------------------------------------- All 1.0607 -0.0323 0.4797 0.8367 ================================================================================ Period: 2016 | Model: pyGETM ================================================================================ Analysed: 2026-05-08 17:11:33 --- CCI-SSS --- RMSE: 1.0796 Bias: +0.0085 MAE: 0.5070 Correlation: 0.8303 N points: 24,460,506 Model mean: 34.8929 Obs mean: 34.8875 Model std: 1.8572 Obs std: 1.1664 Error distribution: Min: -25.9802 5th pct: -1.3326 25th pct: -0.0760 Median: +0.1063 75th pct: +0.3527 95th pct: +1.0101 Max: +12.3821 ================================================================================ Period: 2017 | Model: pyGETM ================================================================================ Analysed: 2026-05-08 17:11:33 --- CCI-SSS --- RMSE: 0.9894 Bias: -0.0370 MAE: 0.4350 Correlation: 0.8368 N points: 24,395,369 Model mean: 34.8868 Obs mean: 34.9268 Model std: 1.7528 Obs std: 1.1686 Error distribution: Min: -28.0616 5th pct: -1.4195 25th pct: -0.0959 Median: +0.0304 75th pct: +0.2517 95th pct: +0.9291 Max: +9.1558 ================================================================================ Period: 2018 | Model: pyGETM ================================================================================ Analysed: 2026-05-08 17:11:33 --- CCI-SSS --- RMSE: 0.8767 Bias: -0.0191 MAE: 0.3859 Correlation: 0.8657 N points: 24,338,489 Model mean: 34.9172 Obs mean: 34.9407 Model std: 1.6709 Obs std: 1.1622 Error distribution: Min: -29.8512 5th pct: -0.9527 25th pct: -0.1005 Median: +0.0411 75th pct: +0.2498 95th pct: +0.7908 Max: +7.9468 ================================================================================ Period: 2019 | Model: pyGETM ================================================================================ Analysed: 2026-05-08 17:11:33 --- CCI-SSS --- RMSE: 0.9390 Bias: -0.0089 MAE: 0.4355 Correlation: 0.8454 N points: 24,377,458 Model mean: 34.8873 Obs mean: 34.8998 Model std: 1.7062 Obs std: 1.1549 Error distribution: Min: -29.7854 5th pct: -1.2546 25th pct: -0.0857 Median: +0.0595 75th pct: +0.2879 95th pct: +0.9240 Max: +8.0505 ================================================================================ Period: 2020 | Model: pyGETM ================================================================================ Analysed: 2026-05-08 17:11:33 --- CCI-SSS --- RMSE: 0.9259 Bias: +0.0438 MAE: 0.4365 Correlation: 0.8375 N points: 24,422,636 Model mean: 34.9239 Obs mean: 34.8879 Model std: 1.6997 Obs std: 1.1916 Error distribution: Min: -28.9147 5th pct: -1.0658 25th pct: -0.0615 Median: +0.0694 75th pct: +0.3168 95th pct: +1.0586 Max: +8.9942 ================================================================================ Period: 2021 | Model: pyGETM ================================================================================ Analysed: 2026-05-08 17:11:33 --- CCI-SSS --- RMSE: 1.0742 Bias: -0.0618 MAE: 0.4787 Correlation: 0.8473 N points: 24,370,685 Model mean: 34.8130 Obs mean: 34.8807 Model std: 1.9232 Obs std: 1.2061 Error distribution: Min: -27.8038 5th pct: -1.7676 25th pct: -0.0616 Median: +0.0734 75th pct: +0.2906 95th pct: +0.8820 Max: +11.8472 ================================================================================ Period: 2022 | Model: pyGETM ================================================================================ Analysed: 2026-05-08 17:11:33 --- CCI-SSS --- RMSE: 1.1325 Bias: -0.0067 MAE: 0.5116 Correlation: 0.8296 N points: 24,370,685 Model mean: 34.8814 Obs mean: 34.8939 Model std: 1.9137 Obs std: 1.1594 Error distribution: Min: -32.4903 5th pct: -1.5464 25th pct: -0.0589 Median: +0.1012 75th pct: +0.3480 95th pct: +1.0333 Max: +10.7502 ================================================================================ Period: 2023 | Model: pyGETM ================================================================================ Analysed: 2026-05-08 17:11:33 --- CCI-SSS --- RMSE: 1.4686 Bias: -0.1778 MAE: 0.6473 Correlation: 0.8015 N points: 24,370,685 Model mean: 34.7064 Obs mean: 34.8901 Model std: 2.3031 Obs std: 1.2056 Error distribution: Min: -28.9906 5th pct: -3.2024 25th pct: -0.0828 Median: +0.0953 75th pct: +0.3439 95th pct: +0.9217 Max: +6.5050 📄 Download Statistics Report (txt) · 📄 YAML\nTEMP_SURFACE Metric OSTIA CCI-SST RMSE 1.1413 1.0988 Bias +0.6880 +0.6777 MAE 0.9304 0.8850 Corr 0.9610 0.9630 Model mean 12.5587 12.7536 Obs mean 11.8707 12.0759 View Full Statistics Report ################################################################################ TEMP_SURFACE Validation Statistics ################################################################################ Format: 1.1 Created: 2026-05-08 16:35:31 Author: RT Project: OceanICU Institute: BB Area: AMM7 Experiment: CMEMS ################################################################################ ================================================================================ Period: 2016-2023 | Model: pyGETM ================================================================================ Analysed: 2026-05-08 16:35:31 --- OSTIA --- RMSE: 1.1413 Bias: +0.6880 MAE: 0.9304 Correlation: 0.9610 N points: 151,821,276 Model mean: 12.5587 Obs mean: 11.8707 Model std: 4.1250 Obs std: 3.8133 Error distribution: Min: -8.7641 5th pct: -0.7154 25th pct: +0.1569 Median: +0.6938 75th pct: +1.2403 95th pct: +2.0577 Max: +10.3511 Monthly breakdown: Month RMSE Bias MAE Corr -------------------------------------------- Jan 1.0662 +0.4158 0.8314 0.9516 Feb 1.0342 +0.3996 0.8026 0.9569 Mar 0.9865 +0.3976 0.7682 0.9601 Apr 0.9751 +0.5232 0.7787 0.9659 May 1.2053 +0.8779 0.9908 0.9657 Jun 1.6858 +1.3275 1.4104 0.9443 Jul 1.6447 +1.2961 1.3954 0.9472 Aug 1.3229 +0.9866 1.1060 0.9599 Sep 0.9637 +0.6132 0.7732 0.9750 Oct 0.8301 +0.4060 0.6628 0.9755 Nov 0.9600 +0.4646 0.7669 0.9634 Dec 1.0871 +0.5277 0.8676 0.9553 -------------------------------------------- All 1.1413 +0.6880 0.9304 0.9610 --- CCI-SST --- RMSE: 1.0988 Bias: +0.6777 MAE: 0.8850 Correlation: 0.9630 N points: 197,655,640 Model mean: 12.7536 Obs mean: 12.0759 Model std: 3.9975 Obs std: 3.7509 Error distribution: Min: -8.6116 5th pct: -0.6143 25th pct: +0.1526 Median: +0.6576 75th pct: +1.2001 95th pct: +2.0247 Max: +9.8150 Monthly breakdown: Month RMSE Bias MAE Corr -------------------------------------------- Jan 1.0157 +0.4205 0.7832 0.9547 Feb 0.9874 +0.4259 0.7585 0.9594 Mar 0.9561 +0.4372 0.7413 0.9619 Apr 0.9438 +0.5342 0.7480 0.9670 May 1.1622 +0.8527 0.9451 0.9657 Jun 1.5979 +1.2445 1.3184 0.9449 Jul 1.5647 +1.2205 1.3068 0.9489 Aug 1.2921 +0.9643 1.0655 0.9621 Sep 0.9516 +0.6128 0.7562 0.9763 Oct 0.8124 +0.4098 0.6375 0.9775 Nov 0.9186 +0.4568 0.7226 0.9669 Dec 1.0494 +0.5349 0.8258 0.9579 -------------------------------------------- All 1.0988 +0.6777 0.8850 0.9630 ================================================================================ Period: 2016 | Model: pyGETM ================================================================================ Analysed: 2026-05-08 16:35:31 --- OSTIA --- RMSE: 1.0372 Bias: +0.4304 MAE: 0.8261 Correlation: 0.9554 N points: 19,016,628 Model mean: 12.3040 Obs mean: 11.8735 Model std: 4.0874 Obs std: 3.7392 Error distribution: Min: -7.7802 5th pct: -1.0101 25th pct: -0.1190 Median: +0.4481 75th pct: +0.9985 95th pct: +1.7915 Max: +7.7702 --- CCI-SST --- RMSE: 0.9632 Bias: +0.3896 MAE: 0.7552 Correlation: 0.9596 N points: 24,757,704 Model mean: 12.4409 Obs mean: 12.0513 Model std: 3.9888 Obs std: 3.7266 Error distribution: Min: -7.4719 5th pct: -0.9291 25th pct: -0.1327 Median: +0.3825 75th pct: +0.9264 95th pct: +1.6953 Max: +9.1459 ================================================================================ Period: 2017 | Model: pyGETM ================================================================================ Analysed: 2026-05-08 16:35:31 --- OSTIA --- RMSE: 1.0966 Bias: +0.6580 MAE: 0.9017 Correlation: 0.9622 N points: 18,964,670 Model mean: 12.5554 Obs mean: 11.8974 Model std: 3.9457 Obs std: 3.6558 Error distribution: Min: -6.9771 5th pct: -0.7381 25th pct: +0.1152 Median: +0.6584 75th pct: +1.2008 95th pct: +2.0068 Max: +9.7926 --- CCI-SST --- RMSE: 1.0432 Bias: +0.6303 MAE: 0.8485 Correlation: 0.9657 N points: 24,690,059 Model mean: 12.7566 Obs mean: 12.1263 Model std: 3.8655 Obs std: 3.6290 Error distribution: Min: -6.6356 5th pct: -0.6719 25th pct: +0.1014 Median: +0.6084 75th pct: +1.1446 95th pct: +1.9419 Max: +7.0723 ================================================================================ Period: 2018 | Model: pyGETM ================================================================================ Analysed: 2026-05-08 16:35:31 --- OSTIA --- RMSE: 1.2056 Bias: +0.7522 MAE: 0.9871 Correlation: 0.9592 N points: 18,964,670 Model mean: 12.3961 Obs mean: 11.6439 Model std: 4.3034 Obs std: 3.9844 Error distribution: Min: -7.2633 5th pct: -0.7586 25th pct: +0.1792 Median: +0.7505 75th pct: +1.3270 95th pct: +2.1497 Max: +10.3511 --- CCI-SST --- RMSE: 1.1715 Bias: +0.7576 MAE: 0.9490 Correlation: 0.9625 N points: 24,690,050 Model mean: 12.5617 Obs mean: 11.8041 Model std: 4.1404 Obs std: 3.8476 Error distribution: Min: -8.6116 5th pct: -0.5983 25th pct: +0.1919 Median: +0.7296 75th pct: +1.3061 95th pct: +2.1444 Max: +9.8150 ================================================================================ Period: 2019 | Model: pyGETM ================================================================================ Analysed: 2026-05-08 16:35:31 --- OSTIA --- RMSE: 1.1243 Bias: +0.6977 MAE: 0.9248 Correlation: 0.9637 N points: 18,964,670 Model mean: 12.4609 Obs mean: 11.7631 Model std: 4.0079 Obs std: 3.6817 Error distribution: Min: -6.5304 5th pct: -0.6951 25th pct: +0.1702 Median: +0.6967 75th pct: +1.2440 95th pct: +2.0405 Max: +8.0854 --- CCI-SST --- RMSE: 1.1028 Bias: +0.7171 MAE: 0.8960 Correlation: 0.9638 N points: 24,690,060 Model mean: 12.6692 Obs mean: 11.9521 Model std: 3.8779 Obs std: 3.6177 Error distribution: Min: -6.3594 5th pct: -0.5700 25th pct: +0.1848 Median: +0.6976 75th pct: +1.2419 95th pct: +2.0499 Max: +8.3861 ================================================================================ Period: 2020 | Model: pyGETM ================================================================================ Analysed: 2026-05-08 16:35:31 --- OSTIA --- RMSE: 1.1024 Bias: +0.6864 MAE: 0.8956 Correlation: 0.9635 N points: 19,016,628 Model mean: 12.4657 Obs mean: 11.7794 Model std: 3.9567 Obs std: 3.6783 Error distribution: Min: -7.2009 5th pct: -0.6766 25th pct: +0.1720 Median: +0.6812 75th pct: +1.2070 95th pct: +2.0251 Max: +8.5298 --- CCI-SST --- RMSE: 1.0867 Bias: +0.7214 MAE: 0.8823 Correlation: 0.9658 N points: 24,757,704 Model mean: 12.6396 Obs mean: 11.9182 Model std: 3.8510 Obs std: 3.6279 Error distribution: Min: -6.3426 5th pct: -0.5347 25th pct: +0.2166 Median: +0.6932 75th pct: +1.2070 95th pct: +2.0145 Max: +9.5877 ================================================================================ Period: 2021 | Model: pyGETM ================================================================================ Analysed: 2026-05-08 16:35:31 --- OSTIA --- RMSE: 1.2379 Bias: +0.8245 MAE: 1.0207 Correlation: 0.9564 N points: 18,964,670 Model mean: 12.5596 Obs mean: 11.7351 Model std: 4.1881 Obs std: 3.8776 Error distribution: Min: -8.7641 5th pct: -0.6137 25th pct: +0.2571 Median: +0.8179 75th pct: +1.3941 95th pct: +2.2158 Max: +9.7990 --- CCI-SST --- RMSE: 1.1927 Bias: +0.7983 MAE: 0.9645 Correlation: 0.9581 N points: 24,689,971 Model mean: 12.7768 Obs mean: 11.9786 Model std: 4.0635 Obs std: 3.8267 Error distribution: Min: -7.9634 5th pct: -0.5196 25th pct: +0.2233 Median: +0.7550 75th pct: +1.3390 95th pct: +2.2036 Max: +9.3973 ================================================================================ Period: 2022 | Model: pyGETM ================================================================================ Analysed: 2026-05-08 16:35:31 --- OSTIA --- RMSE: 1.1100 Bias: +0.6975 MAE: 0.9016 Correlation: 0.9672 N points: 18,964,670 Model mean: 12.7492 Obs mean: 12.0517 Model std: 4.1292 Obs std: 3.8585 Error distribution: Min: -6.6134 5th pct: -0.6229 25th pct: +0.2163 Median: +0.6883 75th pct: +1.2038 95th pct: +1.9885 Max: +8.5413 --- CCI-SST --- RMSE: 1.0662 Bias: +0.6858 MAE: 0.8585 Correlation: 0.9680 N points: 24,690,060 Model mean: 12.9873 Obs mean: 12.3015 Model std: 3.9735 Obs std: 3.7716 Error distribution: Min: -6.5446 5th pct: -0.5330 25th pct: +0.2123 Median: +0.6609 75th pct: +1.1515 95th pct: +1.9579 Max: +8.7850 ================================================================================ Period: 2023 | Model: pyGETM ================================================================================ Analysed: 2026-05-08 16:35:31 --- OSTIA --- RMSE: 1.2137 Bias: +0.7578 MAE: 0.9860 Correlation: 0.9615 N points: 18,964,670 Model mean: 12.9799 Obs mean: 12.2221 Model std: 4.3244 Obs std: 3.9821 Error distribution: Min: -7.2034 5th pct: -0.7201 25th pct: +0.1704 Median: +0.7421 75th pct: +1.3253 95th pct: +2.1965 Max: +9.3188 --- CCI-SST --- RMSE: 1.1607 Bias: +0.7219 MAE: 0.9262 Correlation: 0.9611 N points: 24,690,032 Model mean: 13.1976 Obs mean: 12.4757 Model std: 4.1556 Obs std: 3.9041 Error distribution: Min: -7.4871 5th pct: -0.6567 25th pct: +0.1460 Median: +0.6806 75th pct: +1.2591 95th pct: +2.1728 Max: +8.8208 📄 Download Statistics Report (txt) · 📄 YAML\nPlots Full Period SALT_SURFACE Salinity (surface) — monthly by year\nSalinity (surface) — monthly statistics\nCCI-SSS Salinity (surface) — CCI-SSS comparison\nSalinity (surface) — CCI-SSS monthly maps\nSalinity (surface) — CCI-SSS monthly taylor\nSalinity (surface) — CCI-SSS pdf annual\nSalinity (surface) — CCI-SSS pdf monthly\nSalinity (surface) — CCI-SSS spatial stats\nTEMP_SURFACE Temperature (surface) — monthly by year CCI-SST\nTemperature (surface) — monthly by year OSTIA\nTemperature (surface) — monthly statistics\nCCI-SST Temperature (surface) — CCI-SST comparison\nTemperature (surface) — CCI-SST monthly maps\nTemperature (surface) — CCI-SST monthly taylor\nTemperature (surface) — CCI-SST pdf annual\nTemperature (surface) — CCI-SST pdf monthly\nTemperature (surface) — CCI-SST spatial stats\nOSTIA Temperature (surface) — OSTIA comparison\nTemperature (surface) — OSTIA monthly maps\nTemperature (surface) — OSTIA monthly taylor\nTemperature (surface) — OSTIA pdf annual\nTemperature (surface) — OSTIA pdf monthly\nTemperature (surface) — OSTIA spatial stats\nTaylor diagram\nGridded 3D Validation Statistics SALT_3D Metric WOA RMSE 0.6193 Bias -0.1212 MAE 0.2435 Corr 0.6861 Model mean 35.1620 Obs mean 35.2832 View Full Statistics Report ################################################################################ SALT Validation Statistics ################################################################################ Format: 1.1 Created: 2026-05-08 11:03:44 Author: RT Project: OceanICU Institute: BB Area: AMM7 Experiment: CMEMS ################################################################################ ================================================================================ Period: 2016-2023 | Model: pyGETM ================================================================================ Analysed: 2026-05-29 09:47:15 --- WOA --- RMSE: 0.6193 Bias: -0.1212 MAE: 0.2435 Correlation: 0.6861 N points: 115,591,776 Model mean: 35.1620 Obs mean: 35.2832 Model std: 0.8246 Obs std: 0.4709 Error distribution: Min: -21.7550 5th pct: -0.7287 25th pct: -0.1577 Median: -0.0102 75th pct: +0.0807 95th pct: +0.2843 Max: +8.2900 Monthly breakdown: Month RMSE Bias MAE Corr -------------------------------------------- Jan 0.4203 -0.0804 0.2070 0.7145 Feb 0.4360 -0.0730 0.2139 0.7043 Mar 0.4725 -0.0870 0.2154 0.7278 Apr 0.5372 -0.1114 0.2264 0.7436 May 0.6766 -0.1353 0.2551 0.7110 Jun 0.8148 -0.1676 0.2833 0.6716 Jul 0.8060 -0.1699 0.2855 0.6858 Aug 0.7756 -0.1632 0.2818 0.6600 Sep 0.7362 -0.1515 0.2717 0.6524 Oct 0.5654 -0.1050 0.2399 0.7048 Nov 0.4945 -0.1054 0.2237 0.7140 Dec 0.4942 -0.1044 0.2184 0.6892 -------------------------------------------- All 0.6193 -0.1212 0.2435 0.6861 📄 Download Statistics Report (txt) · 📄 YAML\nTEMP_3D Metric WOA RMSE 2.7734 Bias -0.9734 MAE 1.9600 Corr 0.8239 Model mean 8.2057 Obs mean 9.1791 View Full Statistics Report ################################################################################ TEMP Validation Statistics ################################################################################ Format: 1.1 Created: 2026-05-08 10:23:23 Author: RT Project: OceanICU Institute: BB Area: AMM7 Experiment: CMEMS ################################################################################ ================================================================================ Period: 2016-2023 | Model: pyGETM ================================================================================ Analysed: 2026-05-29 09:16:59 --- WOA --- RMSE: 2.7734 Bias: -0.9734 MAE: 1.9600 Correlation: 0.8239 N points: 115,591,776 Model mean: 8.2057 Obs mean: 9.1791 Model std: 4.5821 Obs std: 3.7598 Error distribution: Min: -8.9458 5th pct: -6.0645 25th pct: -2.3487 Median: -0.3765 75th pct: +0.6248 95th pct: +2.2991 Max: +12.3648 Monthly breakdown: Month RMSE Bias MAE Corr -------------------------------------------- Jan 2.6594 -1.0959 1.8427 0.7916 Feb 2.6465 -1.1075 1.8264 0.7832 Mar 2.6406 -1.0936 1.8154 0.7767 Apr 2.6424 -1.0603 1.8125 0.7793 May 2.7017 -0.9281 1.8904 0.7898 Jun 2.9208 -0.7361 2.1203 0.8063 Jul 3.0226 -0.7164 2.1948 0.8325 Aug 2.9924 -0.7712 2.1892 0.8521 Sep 2.8715 -0.9111 2.0885 0.8604 Oct 2.7603 -1.0841 1.9632 0.8536 Nov 2.7061 -1.0730 1.9017 0.8306 Dec 2.6759 -1.1035 1.8745 0.8129 -------------------------------------------- All 2.7734 -0.9734 1.9600 0.8239 📄 Download Statistics Report (txt) · 📄 YAML\nPlots Full Period Salinity at 5 m depth — model vs observations comparison\nSalinity at 5 m depth — spatial distribution of statistics\nSalinity at 50 m depth — model vs observations comparison\nSalinity at 50 m depth — spatial distribution of statistics\nSalinity at 100 m depth — model vs observations comparison\nSalinity at 100 m depth — spatial distribution of statistics\nSalinity at 200 m depth — model vs observations comparison\nSalinity at 200 m depth — spatial distribution of statistics\nSalinity at 500 m depth — model vs observations comparison\nSalinity at 500 m depth — spatial distribution of statistics\nSalinity — monthly 3D profile statistics\nSalinity — monthly 3D Taylor diagram\nTaylor diagram\nTemperature at 5 m depth — model vs observations comparison\nTemperature at 5 m depth — spatial distribution of statistics\nTemperature at 50 m depth — model vs observations comparison\nTemperature at 50 m depth — spatial distribution of statistics\nTemperature at 100 m depth — model vs observations comparison\nTemperature at 100 m depth — spatial distribution of statistics\nTemperature at 200 m depth — model vs observations comparison\nTemperature at 200 m depth — spatial distribution of statistics\nTemperature at 500 m depth — model vs observations comparison\nTemperature at 500 m depth — spatial distribution of statistics\nTemperature — monthly 3D profile statistics\nTemperature — monthly 3D Taylor diagram\nICES Point Profiles Statistics PSAL Metric ICES point observations RMSE 0.8693 Bias -0.0790 MAE 0.3571 Corr 0.8309 Model mean 34.7325 Obs mean 34.8115 View Full Statistics Report ################################################################################ PSAL Profile Validation Statistics ################################################################################ Format: 1.1 Created: 2026-05-29 12:50:20 Area: AMM7 Experiment: CMEMS ################################################################################ ================================================================================ Period: 2016-2022 | Model: pyGETM ================================================================================ Analysed: 2026-05-29 12:50:20 --- ICES point observations --- RMSE: 0.8693 Bias: -0.0790 MAE: 0.3571 Correlation: 0.8309 N points: 3,994,080 N profiles: 28,533 Model mean: 34.7325 Obs mean: 34.8115 Model std: 1.5534 Obs std: 1.2408 Error distribution: Min: -16.0520 5th pct: -1.5073 25th pct: -0.0131 Median: +0.0862 75th pct: +0.1968 95th pct: +0.3995 Max: +35.3630 Statistics by depth: Depth N Bias RMSE Corr ------------------------------------------------------ 0-10m 253,019 -0.6167 2.4318 0.8036 10-25m 378,314 -0.5078 1.4665 0.8190 25-50m 515,654 -0.2435 0.9340 0.8092 50-100m 694,512 -0.0481 0.5144 0.8011 100-200m 607,268 +0.0528 0.2300 0.7756 200-500m 686,298 +0.1196 0.1642 0.7857 500-1000m 509,815 +0.0762 0.1375 0.9011 ================================================================================ Period: 2016-2023 | Model: pyGETM ================================================================================ Analysed: 2026-05-29 15:32:24 --- ICES point observations --- RMSE: 1.0209 Bias: -0.1258 MAE: 0.4010 Correlation: 0.8191 N points: 4,478,542 N profiles: 32,071 Model mean: 34.6560 Obs mean: 34.7818 Model std: 1.7615 Obs std: 1.3717 Error distribution: Min: -34.9143 5th pct: -1.7766 25th pct: -0.0276 Median: +0.0780 75th pct: +0.1949 95th pct: +0.3946 Max: +35.3630 Statistics by depth: Depth N Bias RMSE Corr ------------------------------------------------------ 0-10m 287,144 -0.7661 2.7377 0.7952 10-25m 420,745 -0.6664 1.8033 0.7947 25-50m 567,989 -0.3483 1.1759 0.7783 50-100m 763,824 -0.0879 0.5991 0.7810 100-200m 681,882 +0.0481 0.2392 0.7674 200-500m 782,467 +0.1191 0.1669 0.7668 500-1000m 586,611 +0.0641 0.1384 0.8677 📄 Download Statistics Report (txt) · 📄 YAML\nTEMP Metric ICES point observations RMSE 1.3146 Bias +0.4313 MAE 0.9325 Corr 0.9535 Model mean 8.0082 Obs mean 7.5769 View Full Statistics Report ################################################################################ TEMP Profile Validation Statistics ################################################################################ Format: 1.1 Created: 2026-05-29 12:48:28 Area: AMM7 Experiment: CMEMS ################################################################################ ================================================================================ Period: 2016-2022 | Model: pyGETM ================================================================================ Analysed: 2026-05-29 12:48:28 --- ICES point observations --- RMSE: 1.3146 Bias: +0.4313 MAE: 0.9325 Correlation: 0.9535 N points: 4,003,593 N profiles: 25,653 Model mean: 8.0082 Obs mean: 7.5769 Model std: 4.0734 Obs std: 4.0727 Error distribution: Min: -11.0577 5th pct: -1.4014 25th pct: -0.1323 Median: +0.4438 75th pct: +1.0757 95th pct: +2.2245 Max: +10.2527 Statistics by depth: Depth N Bias RMSE Corr ------------------------------------------------------ 0-10m 251,709 +0.5441 1.2650 0.9667 10-25m 379,993 +0.0030 1.4262 0.9238 25-50m 518,214 +0.0796 1.3802 0.8467 50-100m 697,441 +0.5071 1.0608 0.8460 100-200m 609,761 +0.6690 1.1249 0.8282 200-500m 687,489 +0.6365 1.7041 0.8223 500-1000m 509,785 +0.3650 1.2749 0.9580 ================================================================================ Period: 2016-2023 | Model: pyGETM ================================================================================ Analysed: 2026-05-29 15:30:25 --- ICES point observations --- RMSE: 1.3309 Bias: +0.4152 MAE: 0.9451 Correlation: 0.9511 N points: 4,487,747 N profiles: 28,918 Model mean: 8.0521 Obs mean: 7.6368 Model std: 4.0375 Obs std: 4.0486 Error distribution: Min: -11.0577 5th pct: -1.5032 25th pct: -0.1472 Median: +0.4304 75th pct: +1.0734 95th pct: +2.2273 Max: +10.2527 Statistics by depth: Depth N Bias RMSE Corr ------------------------------------------------------ 0-10m 285,609 +0.5162 1.2835 0.9660 10-25m 422,418 -0.0113 1.4414 0.9236 25-50m 570,518 +0.0700 1.3988 0.8455 50-100m 766,720 +0.5109 1.0671 0.8419 100-200m 684,363 +0.6834 1.1348 0.8224 200-500m 783,657 +0.6413 1.7283 0.8155 500-1000m 586,581 +0.2694 1.2916 0.9570 📄 Download Statistics Report (txt) · 📄 YAML\nPlots Practical Salinity — statistics vs depth profile\nTemperature — statistics vs depth profile\nPractical Salinity — statistics vs depth profile\nTemperature — statistics vs depth profile\nArgo Float Profiles Statistics PSAL Metric ARGO floats RMSE 4.3279 Bias +0.6360 MAE 0.7451 Corr 0.1770 Model mean 35.3282 Obs mean 34.6922 View Full Statistics Report ################################################################################ PSAL Profile Validation Statistics ################################################################################ Format: 1.1 Created: 2026-05-08 11:09:22 Area: AMM7 Experiment: CMEMS ################################################################################ ================================================================================ Period: 2016-2023 | Model: pyGETM ================================================================================ Analysed: 2026-05-08 11:09:22 --- ARGO floats --- RMSE: 4.3279 Bias: +0.6360 MAE: 0.7451 Correlation: 0.1770 N points: 4,904,713 N profiles: 18,472 Model mean: 35.3282 Obs mean: 34.6922 Model std: 0.3125 Obs std: 4.3252 Error distribution: Min: -26.4725 5th pct: -0.2923 25th pct: -0.0239 Median: +0.0314 75th pct: +0.1434 95th pct: +0.4283 Max: +36.9164 Statistics by depth: Depth N Bias RMSE Corr ------------------------------------------------------ 0-10m 96,557 +0.5205 3.2047 0.1672 10-25m 146,016 +0.6579 3.6003 0.1402 25-50m 232,397 +0.7302 3.7176 0.1271 50-100m 425,227 +0.7562 3.8331 0.1305 100-200m 495,254 +0.6813 4.4494 0.1906 200-500m 1,075,494 +0.6730 4.6080 0.2194 500-1000m 1,117,739 +0.5876 4.5106 0.2577 📄 Download Statistics Report (txt) · 📄 YAML\nTEMP Metric ARGO floats RMSE 1.2432 Bias +0.2704 MAE 0.8965 Corr 0.9662 Model mean 8.3531 Obs mean 8.0826 View Full Statistics Report ################################################################################ TEMP Profile Validation Statistics ################################################################################ Format: 1.1 Created: 2026-05-08 11:07:35 Area: AMM7 Experiment: CMEMS ################################################################################ ================================================================================ Period: 2016-2023 | Model: pyGETM ================================================================================ Analysed: 2026-05-08 11:07:35 --- ARGO floats --- RMSE: 1.2432 Bias: +0.2704 MAE: 0.8965 Correlation: 0.9662 N points: 4,905,048 N profiles: 18,472 Model mean: 8.3531 Obs mean: 8.0826 Model std: 4.7007 Obs std: 4.4672 Error distribution: Min: -49.4755 5th pct: -1.5465 25th pct: -0.3753 Median: +0.1166 75th pct: +0.9699 95th pct: +2.2558 Max: +20.7322 Statistics by depth: Depth N Bias RMSE Corr ------------------------------------------------------ 0-10m 96,568 +0.7477 1.2123 0.9749 10-25m 146,026 +0.4453 1.1846 0.9602 25-50m 232,410 +0.6373 1.4017 0.9237 50-100m 425,244 +0.9959 1.6562 0.9122 100-200m 495,283 +0.6026 1.5595 0.9199 200-500m 1,075,630 +0.1888 1.2823 0.9479 500-1000m 1,117,875 -0.2711 0.9465 0.9734 📄 Download Statistics Report (txt) · 📄 YAML\nPlots Amm7 Argo Overview\nPractical Salinity — statistics vs depth profile\nTemperature — statistics vs depth profile\nObservations ARGO Observations — 2016-2023 ARGO Station Map\nARGO Observation Density\nARGO Hovmoller\nICES Observations — 2016-2022 ICES Station Map\nICES Observation Density\nICES Alk Hovmoller\nICES Amon Hovmoller\nICES Doxy Hovmoller\nICES Ntra Hovmoller\nICES Ph Hovmoller\nICES Phos Hovmoller\nICES PSAL Hovmoller\nICES Slca Hovmoller\nICES TEMP Hovmoller\nICES Observations — 2016-2023 ICES Station Map\nICES Observation Density\nICES Alk Hovmoller\nICES Amon Hovmoller\nICES Cphl Hovmoller\nICES Doxy Hovmoller\nICES Ntra Hovmoller\nICES Ph Hovmoller\nICES Phos Hovmoller\nICES PSAL Hovmoller\nICES Slca Hovmoller\nICES TEMP Hovmoller\nMethodology Horizontal Validation Model surface fields compared against gridded satellite products and in-situ observations.\nStatistics: RMSE, Bias, MAE, Pearson correlation.\nSpatial statistics show the error distribution across the domain.\nGridded 3D Validation Model vertical profiles compared against gridded 3D climatologies.\nStatistics: RMSE and Bias at each depth level.\nICES Point Profiles Quality-controlled hydrographic profiles from the ICES data portal (temperature, salinity, biogeochemical variables).\nArgo Float Profiles Autonomous profiling floats providing temperature and salinity profiles to 2000 m depth (Ifremer ERDDAP).\n← Back to AMM7 View All Validations →\n","permalink":"https://bolding-bruggeman.com/oceanicu_3d/validations/amm7-cmems/","summary":"\u003cp\u003eHorizontal Validation results comparing model output against observations.\u003c/p\u003e\n\u003ch2 id=\"experiment-information\"\u003eExperiment Information\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eArea\u003c/strong\u003e: AMM7\n\u003cstrong\u003eExperiment\u003c/strong\u003e: CMEMS\n\u003cstrong\u003eValidation Type\u003c/strong\u003e: Horizontal Validation\n\u003cstrong\u003eVariables\u003c/strong\u003e: SALT_SURFACE, TEMP_SURFACE\u003c/p\u003e\n\u003ch2 id=\"overview\"\u003eOverview\u003c/h2\u003e\n\u003ctable\u003e\n  \u003cthead\u003e\n      \u003ctr\u003e\n          \u003cth\u003eMetric\u003c/th\u003e\n          \u003cth\u003eSALT_SURFACE / CCI-SSS\u003c/th\u003e\n          \u003cth\u003eTEMP_SURFACE / OSTIA\u003c/th\u003e\n          \u003cth\u003eTEMP_SURFACE / CCI-SST\u003c/th\u003e\n      \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eRMSE\u003c/td\u003e\n          \u003ctd\u003e1.0607\u003c/td\u003e\n          \u003ctd\u003e1.1413\u003c/td\u003e\n          \u003ctd\u003e1.0988\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eBias\u003c/td\u003e\n          \u003ctd\u003e-0.0323\u003c/td\u003e\n          \u003ctd\u003e0.6880\u003c/td\u003e\n          \u003ctd\u003e0.6777\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eCorr\u003c/td\u003e\n          \u003ctd\u003e0.8367\u003c/td\u003e\n          \u003ctd\u003e0.9610\u003c/td\u003e\n          \u003ctd\u003e0.9630\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eN points\u003c/td\u003e\n          \u003ctd\u003e195,106,513\u003c/td\u003e\n          \u003ctd\u003e151,821,276\u003c/td\u003e\n          \u003ctd\u003e197,655,640\u003c/td\u003e\n      \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch3 id=\"annual-statistics-trends\"\u003eAnnual Statistics Trends\u003c/h3\u003e\n\u003cp\u003e\u003cimg alt=\"Salinity (surface) — annual statistics timeseries (RMSE, bias, correlation)\" loading=\"lazy\" src=\"/validation-data/amm7-cmems/physics/pyGETM/2016-2023/surface/salt_surface_timeseries_statistics.png\"\u003e\n\u003cem\u003eSalinity (surface) — annual statistics timeseries (RMSE, bias, correlation)\u003c/em\u003e\u003c/p\u003e","title":"AMM7 - Experiment CMEMS"},{"content":"Horizontal Validation results comparing model output against observations.\nExperiment Information Area: AMM7 Experiment: CMEMS_prof Validation Type: Horizontal Validation Variables: SALT_SURFACE, TEMP_SURFACE\nOverview Metric SALT_SURFACE / CCI-SSS TEMP_SURFACE / OSTIA TEMP_SURFACE / CCI-SST RMSE 0.8866 1.0272 1.0031 Bias 0.0802 0.4192 0.4755 Corr 0.8318 0.9479 0.9550 N points 170,735,828 132,856,606 172,965,608 Annual Statistics Trends Salinity (surface) — annual statistics timeseries (RMSE, bias, correlation)\nTemperature (surface) — annual statistics timeseries (RMSE, bias, correlation)\nHorizontal Validation Statistics SALT_SURFACE Metric CCI-SSS RMSE 0.8866 Bias +0.0802 MAE 0.4354 Corr 0.8318 Model mean 34.9782 Obs mean 34.9024 View Full Statistics Report ################################################################################ SALT_SURFACE Validation Statistics ################################################################################ Format: 1.1 Created: 2026-05-28 10:10:48 Author: RT Project: OceanICU Institute: BB Area: AMM7 Experiment: CMEMS_prof ################################################################################ ================================================================================ Period: 2016-2023 | Model: pyGETM ================================================================================ Analysed: 2026-05-28 10:10:48 --- CCI-SSS --- RMSE: 0.8866 Bias: +0.0802 MAE: 0.4354 Correlation: 0.8318 N points: 170,735,828 Model mean: 34.9782 Obs mean: 34.9024 Model std: 1.5983 Obs std: 1.1730 Error distribution: Min: -32.5268 5th pct: -0.9079 25th pct: -0.0452 Median: +0.1136 75th pct: +0.3249 95th pct: +1.0717 Max: +12.1194 Monthly breakdown: Month RMSE Bias MAE Corr -------------------------------------------- Jan 0.8112 +0.0827 0.3839 0.8069 Feb 0.8535 +0.0700 0.3771 0.7989 Mar 0.9450 +0.0863 0.4155 0.7862 Apr 0.9278 +0.0960 0.4410 0.8093 May 0.8897 +0.0859 0.4387 0.8607 Jun 0.9593 +0.0753 0.4681 0.8666 Jul 0.9033 +0.0406 0.4585 0.8695 Aug 0.9457 +0.0509 0.4830 0.8482 Sep 0.9395 +0.0624 0.4751 0.8444 Oct 0.8564 +0.0994 0.4451 0.8262 Nov 0.8517 +0.1303 0.4371 0.8054 Dec 0.8201 +0.0830 0.3991 0.8226 -------------------------------------------- All 0.8866 +0.0802 0.4354 0.8318 ================================================================================ Period: 2016 | Model: pyGETM ================================================================================ Analysed: 2026-05-28 10:10:48 --- CCI-SSS --- RMSE: 0.8573 Bias: +0.1151 MAE: 0.4303 Correlation: 0.8510 N points: 24,460,506 Model mean: 34.9999 Obs mean: 34.8875 Model std: 1.6039 Obs std: 1.1664 Error distribution: Min: -26.0535 5th pct: -0.7276 25th pct: -0.0254 Median: +0.1326 75th pct: +0.3537 95th pct: +1.0593 Max: +12.1194 ================================================================================ Period: 2017 | Model: pyGETM ================================================================================ Analysed: 2026-05-28 10:10:48 --- CCI-SSS --- RMSE: 0.8426 Bias: +0.0559 MAE: 0.3956 Correlation: 0.8414 N points: 24,395,369 Model mean: 34.9800 Obs mean: 34.9268 Model std: 1.5603 Obs std: 1.1686 Error distribution: Min: -28.1669 5th pct: -0.8372 25th pct: -0.0640 Median: +0.0754 75th pct: +0.2645 95th pct: +1.0164 Max: +9.1506 ================================================================================ Period: 2018 | Model: pyGETM ================================================================================ Analysed: 2026-05-28 10:10:48 --- CCI-SSS --- RMSE: 0.8267 Bias: +0.0868 MAE: 0.3953 Correlation: 0.8333 N points: 24,338,489 Model mean: 35.0231 Obs mean: 34.9407 Model std: 1.4832 Obs std: 1.1622 Error distribution: Min: -29.8683 5th pct: -0.7027 25th pct: -0.0497 Median: +0.1082 75th pct: +0.3062 95th pct: +0.9578 Max: +12.0495 ================================================================================ Period: 2019 | Model: pyGETM ================================================================================ Analysed: 2026-05-28 10:10:48 --- CCI-SSS --- RMSE: 0.8217 Bias: +0.1100 MAE: 0.4197 Correlation: 0.8286 N points: 24,377,458 Model mean: 35.0064 Obs mean: 34.8998 Model std: 1.4717 Obs std: 1.1549 Error distribution: Min: -29.5824 5th pct: -0.7546 25th pct: -0.0424 Median: +0.1198 75th pct: +0.3381 95th pct: +1.0921 Max: +9.2627 ================================================================================ Period: 2020 | Model: pyGETM ================================================================================ Analysed: 2026-05-28 10:10:48 --- CCI-SSS --- RMSE: 0.8968 Bias: +0.1029 MAE: 0.4377 Correlation: 0.8103 N points: 24,422,636 Model mean: 34.9837 Obs mean: 34.8879 Model std: 1.5705 Obs std: 1.1916 Error distribution: Min: -29.1297 5th pct: -0.8224 25th pct: -0.0397 Median: +0.1052 75th pct: +0.3198 95th pct: +1.1681 Max: +8.9942 ================================================================================ Period: 2021 | Model: pyGETM ================================================================================ Analysed: 2026-05-28 10:10:48 --- CCI-SSS --- RMSE: 0.9505 Bias: +0.0201 MAE: 0.4721 Correlation: 0.8403 N points: 24,370,685 Model mean: 34.8953 Obs mean: 34.8807 Model std: 1.7522 Obs std: 1.2061 Error distribution: Min: -28.1046 5th pct: -1.3029 25th pct: -0.0504 Median: +0.1216 75th pct: +0.3274 95th pct: +1.0076 Max: +11.7662 ================================================================================ Period: 2022 | Model: pyGETM ================================================================================ Analysed: 2026-05-28 10:10:48 --- CCI-SSS --- RMSE: 1.0083 Bias: +0.0705 MAE: 0.4971 Correlation: 0.8180 N points: 24,370,685 Model mean: 34.9590 Obs mean: 34.8939 Model std: 1.7211 Obs std: 1.1594 Error distribution: Min: -32.5268 5th pct: -1.1393 25th pct: -0.0446 Median: +0.1252 75th pct: +0.3552 95th pct: +1.1837 Max: +10.7502 📄 Download Statistics Report (txt) · 📄 YAML\nTEMP_SURFACE Metric OSTIA CCI-SST RMSE 1.0272 1.0031 Bias +0.4192 +0.4755 MAE 0.8017 0.7851 Corr 0.9479 0.9550 Model mean 12.2398 12.4943 Obs mean 11.8206 12.0189 View Full Statistics Report ################################################################################ TEMP_SURFACE Validation Statistics ################################################################################ Format: 1.1 Created: 2026-05-28 09:43:10 Author: RT Project: OceanICU Institute: BB Area: AMM7 Experiment: CMEMS_prof ################################################################################ ================================================================================ Period: 2016-2023 | Model: pyGETM ================================================================================ Analysed: 2026-05-28 09:43:10 --- OSTIA --- RMSE: 1.0272 Bias: +0.4192 MAE: 0.8017 Correlation: 0.9479 N points: 132,856,606 Model mean: 12.2398 Obs mean: 11.8206 Model std: 3.6878 Obs std: 3.7859 Error distribution: Min: -12.5796 5th pct: -1.1147 25th pct: -0.0900 Median: +0.4479 75th pct: +0.9583 95th pct: +1.8836 Max: +9.9159 Monthly breakdown: Month RMSE Bias MAE Corr -------------------------------------------- Jan 0.9764 +0.3082 0.7456 0.9387 Feb 0.9233 +0.2761 0.6858 0.9479 Mar 0.8848 +0.2931 0.6505 0.9526 Apr 0.8361 +0.3726 0.6401 0.9615 May 0.9182 +0.5209 0.7384 0.9623 Jun 1.2008 +0.6604 0.9741 0.9433 Jul 1.3202 +0.6374 1.0694 0.9338 Aug 1.2043 +0.4679 0.9562 0.9392 Sep 1.0576 +0.3174 0.8241 0.9537 Oct 0.9766 +0.3090 0.7557 0.9569 Nov 1.0152 +0.4090 0.7741 0.9448 Dec 1.0395 +0.4489 0.7966 0.9357 -------------------------------------------- All 1.0272 +0.4192 0.8017 0.9479 --- CCI-SST --- RMSE: 1.0031 Bias: +0.4755 MAE: 0.7851 Correlation: 0.9550 N points: 172,965,608 Model mean: 12.4943 Obs mean: 12.0189 Model std: 3.6535 Obs std: 3.7251 Error distribution: Min: -12.9171 5th pct: -0.9264 25th pct: -0.0254 Median: +0.4851 75th pct: +0.9926 95th pct: +1.8553 Max: +9.4268 Monthly breakdown: Month RMSE Bias MAE Corr -------------------------------------------- Jan 0.9380 +0.3532 0.7133 0.9489 Feb 0.8946 +0.3490 0.6682 0.9564 Mar 0.8763 +0.3798 0.6520 0.9593 Apr 0.8495 +0.4423 0.6575 0.9654 May 0.9265 +0.5796 0.7471 0.9657 Jun 1.1568 +0.6971 0.9405 0.9498 Jul 1.2544 +0.6703 1.0156 0.9427 Aug 1.1670 +0.5356 0.9287 0.9479 Sep 1.0264 +0.3866 0.8008 0.9600 Oct 0.9634 +0.3649 0.7421 0.9619 Nov 0.9957 +0.4422 0.7592 0.9514 Dec 1.0222 +0.4958 0.7861 0.9448 -------------------------------------------- All 1.0031 +0.4755 0.7851 0.9550 ================================================================================ Period: 2016 | Model: pyGETM ================================================================================ Analysed: 2026-05-28 09:43:10 --- OSTIA --- RMSE: 0.9711 Bias: +0.2519 MAE: 0.7584 Correlation: 0.9475 N points: 19,016,628 Model mean: 12.1255 Obs mean: 11.8735 Model std: 3.7611 Obs std: 3.7392 Error distribution: Min: -10.6034 5th pct: -1.2672 25th pct: -0.2575 Median: +0.2846 75th pct: +0.8119 95th pct: +1.6858 Max: +6.4671 --- CCI-SST --- RMSE: 0.9101 Bias: +0.2927 MAE: 0.7083 Correlation: 0.9575 N points: 24,757,704 Model mean: 12.3440 Obs mean: 12.0513 Model std: 3.7325 Obs std: 3.7266 Error distribution: Min: -11.0251 5th pct: -1.0776 25th pct: -0.1841 Median: +0.3134 75th pct: +0.8145 95th pct: +1.5956 Max: +7.3013 ================================================================================ Period: 2017 | Model: pyGETM ================================================================================ Analysed: 2026-05-28 09:43:10 --- OSTIA --- RMSE: 0.9844 Bias: +0.3971 MAE: 0.7712 Correlation: 0.9490 N points: 18,964,670 Model mean: 12.2945 Obs mean: 11.8974 Model std: 3.5212 Obs std: 3.6558 Error distribution: Min: -11.1250 5th pct: -1.0841 25th pct: -0.0903 Median: +0.4354 75th pct: +0.9203 95th pct: +1.8100 Max: +9.0303 --- CCI-SST --- RMSE: 0.9464 Bias: +0.4140 MAE: 0.7441 Correlation: 0.9569 N points: 24,690,059 Model mean: 12.5403 Obs mean: 12.1263 Model std: 3.5342 Obs std: 3.6290 Error distribution: Min: -11.0290 5th pct: -0.9622 25th pct: -0.0733 Median: +0.4392 75th pct: +0.9222 95th pct: +1.7439 Max: +7.1730 ================================================================================ Period: 2018 | Model: pyGETM ================================================================================ Analysed: 2026-05-28 09:43:10 --- OSTIA --- RMSE: 1.1059 Bias: +0.4927 MAE: 0.8620 Correlation: 0.9444 N points: 18,964,670 Model mean: 12.1366 Obs mean: 11.6439 Model std: 3.8741 Obs std: 3.9844 Error distribution: Min: -10.3536 5th pct: -1.1036 25th pct: -0.0593 Median: +0.5111 75th pct: +1.0665 95th pct: +2.0356 Max: +9.1027 --- CCI-SST --- RMSE: 1.0858 Bias: +0.5573 MAE: 0.8480 Correlation: 0.9518 N points: 24,690,050 Model mean: 12.3614 Obs mean: 11.8041 Model std: 3.7917 Obs std: 3.8476 Error distribution: Min: -10.1898 5th pct: -0.8738 25th pct: +0.0181 Median: +0.5560 75th pct: +1.1075 95th pct: +2.0240 Max: +8.3808 ================================================================================ Period: 2019 | Model: pyGETM ================================================================================ Analysed: 2026-05-28 09:43:10 --- OSTIA --- RMSE: 1.0372 Bias: +0.4775 MAE: 0.8162 Correlation: 0.9480 N points: 18,964,670 Model mean: 12.2406 Obs mean: 11.7631 Model std: 3.5578 Obs std: 3.6817 Error distribution: Min: -10.1604 5th pct: -1.0140 25th pct: -0.0423 Median: +0.5012 75th pct: +1.0188 95th pct: +1.9494 Max: +7.0863 --- CCI-SST --- RMSE: 1.0284 Bias: +0.5445 MAE: 0.8085 Correlation: 0.9536 N points: 24,690,060 Model mean: 12.4965 Obs mean: 11.9521 Model std: 3.5237 Obs std: 3.6177 Error distribution: Min: -10.7550 5th pct: -0.8099 25th pct: +0.0178 Median: +0.5414 75th pct: +1.0724 95th pct: +1.9664 Max: +6.9857 ================================================================================ Period: 2020 | Model: pyGETM ================================================================================ Analysed: 2026-05-28 09:43:10 --- OSTIA --- RMSE: 0.9941 Bias: +0.3744 MAE: 0.7732 Correlation: 0.9482 N points: 19,016,628 Model mean: 12.1537 Obs mean: 11.7794 Model std: 3.5325 Obs std: 3.6783 Error distribution: Min: -12.5796 5th pct: -1.1772 25th pct: -0.1186 Median: +0.4096 75th pct: +0.9065 95th pct: +1.8162 Max: +8.0812 --- CCI-SST --- RMSE: 0.9897 Bias: +0.4743 MAE: 0.7769 Correlation: 0.9546 N points: 24,757,704 Model mean: 12.3926 Obs mean: 11.9182 Model std: 3.5221 Obs std: 3.6279 Error distribution: Min: -12.9171 5th pct: -0.9447 25th pct: -0.0113 Median: +0.4851 75th pct: +0.9818 95th pct: +1.8416 Max: +8.6647 ================================================================================ Period: 2021 | Model: pyGETM ================================================================================ Analysed: 2026-05-28 09:43:10 --- OSTIA --- RMSE: 1.0847 Bias: +0.5151 MAE: 0.8532 Correlation: 0.9444 N points: 18,964,670 Model mean: 12.2502 Obs mean: 11.7351 Model std: 3.8264 Obs std: 3.8776 Error distribution: Min: -9.4916 5th pct: -1.0401 25th pct: -0.0174 Median: +0.5381 75th pct: +1.0673 95th pct: +2.0778 Max: +9.9159 --- CCI-SST --- RMSE: 1.0759 Bias: +0.5751 MAE: 0.8461 Correlation: 0.9514 N points: 24,689,971 Model mean: 12.5536 Obs mean: 11.9786 Model std: 3.7981 Obs std: 3.8267 Error distribution: Min: -11.2869 5th pct: -0.8736 25th pct: +0.0470 Median: +0.5737 75th pct: +1.1068 95th pct: +2.0469 Max: +9.4268 ================================================================================ Period: 2022 | Model: pyGETM ================================================================================ Analysed: 2026-05-28 09:43:10 --- OSTIA --- RMSE: 1.0114 Bias: +0.4266 MAE: 0.7780 Correlation: 0.9547 N points: 18,964,670 Model mean: 12.4782 Obs mean: 12.0517 Model std: 3.7123 Obs std: 3.8585 Error distribution: Min: -12.4475 5th pct: -1.0535 25th pct: -0.0504 Median: +0.4487 75th pct: +0.9241 95th pct: +1.8781 Max: +8.5413 --- CCI-SST --- RMSE: 0.9847 Bias: +0.4708 MAE: 0.7637 Correlation: 0.9595 N points: 24,690,060 Model mean: 12.7723 Obs mean: 12.3015 Model std: 3.6414 Obs std: 3.7716 Error distribution: Min: -12.3007 5th pct: -0.8898 25th pct: -0.0004 Median: +0.4833 75th pct: +0.9501 95th pct: +1.8266 Max: +8.6596 📄 Download Statistics Report (txt) · 📄 YAML\nPlots Full Period SALT_SURFACE Salinity (surface) — monthly by year\nSalinity (surface) — monthly statistics\nCCI-SSS Salinity (surface) — CCI-SSS comparison\nSalinity (surface) — CCI-SSS monthly maps\nSalinity (surface) — CCI-SSS monthly taylor\nSalinity (surface) — CCI-SSS pdf annual\nSalinity (surface) — CCI-SSS pdf monthly\nSalinity (surface) — CCI-SSS spatial stats\nTEMP_SURFACE Temperature (surface) — monthly by year CCI-SST\nTemperature (surface) — monthly by year OSTIA\nTemperature (surface) — monthly statistics\nCCI-SST Temperature (surface) — CCI-SST comparison\nTemperature (surface) — CCI-SST monthly maps\nTemperature (surface) — CCI-SST monthly taylor\nTemperature (surface) — CCI-SST pdf annual\nTemperature (surface) — CCI-SST pdf monthly\nTemperature (surface) — CCI-SST spatial stats\nOSTIA Temperature (surface) — OSTIA comparison\nTemperature (surface) — OSTIA monthly maps\nTemperature (surface) — OSTIA monthly taylor\nTemperature (surface) — OSTIA pdf annual\nTemperature (surface) — OSTIA pdf monthly\nTemperature (surface) — OSTIA spatial stats\nTaylor diagram\nGridded 3D Validation Statistics SALT_3D Metric WOA RMSE 0.4526 Bias -0.1253 MAE 0.2327 Corr 0.7155 Model mean 35.1640 Obs mean 35.2893 View Full Statistics Report ################################################################################ SALT Validation Statistics ################################################################################ Format: 1.1 Created: 2026-05-29 12:09:50 Author: RT Project: OceanICU Institute: BB Area: AMM7 Experiment: CMEMS_prof ################################################################################ ================================================================================ Period: 2016-2022 | Model: pyGETM ================================================================================ Analysed: 2026-05-29 12:09:50 --- WOA --- RMSE: 0.4526 Bias: -0.1253 MAE: 0.2327 Correlation: 0.7155 N points: 118,126,680 Model mean: 35.1640 Obs mean: 35.2893 Model std: 0.6221 Obs std: 0.4622 Error distribution: Min: -18.8635 5th pct: -0.7326 25th pct: -0.2239 Median: -0.0391 75th pct: +0.0572 95th pct: +0.2731 Max: +11.5541 Monthly breakdown: Month RMSE Bias MAE Corr -------------------------------------------- Jan 0.3786 -0.1042 0.2156 0.6994 Feb 0.3776 -0.0972 0.2136 0.7079 Mar 0.3889 -0.1053 0.2129 0.7377 Apr 0.4034 -0.1219 0.2171 0.7555 May 0.4529 -0.1293 0.2332 0.7520 Jun 0.5089 -0.1468 0.2470 0.7481 Jul 0.5271 -0.1494 0.2521 0.7278 Aug 0.5364 -0.1494 0.2551 0.7026 Sep 0.5254 -0.1465 0.2503 0.6982 Oct 0.4657 -0.1122 0.2439 0.7017 Nov 0.4074 -0.1194 0.2273 0.7054 Dec 0.4119 -0.1221 0.2242 0.6815 -------------------------------------------- All 0.4526 -0.1253 0.2327 0.7155 ================================================================================ Period: 2016-2023 | Model: pyGETM ================================================================================ Analysed: 2026-05-29 16:14:21 --- WOA --- RMSE: 0.5154 Bias: -0.1342 MAE: 0.2422 Correlation: 0.6853 N points: 133,595,650 Model mean: 35.1550 Obs mean: 35.2892 Model std: 0.6833 Obs std: 0.4630 Error distribution: Min: -18.8609 5th pct: -0.7437 25th pct: -0.2269 Median: -0.0375 75th pct: +0.0605 95th pct: +0.2712 Max: +11.5549 Monthly breakdown: Month RMSE Bias MAE Corr -------------------------------------------- Jan 0.3813 -0.1057 0.2168 0.6958 Feb 0.3905 -0.1009 0.2168 0.6985 Mar 0.4152 -0.1125 0.2191 0.7204 Apr 0.4534 -0.1302 0.2244 0.7361 May 0.5589 -0.1430 0.2472 0.7034 Jun 0.6598 -0.1664 0.2682 0.6830 Jul 0.6377 -0.1647 0.2686 0.6870 Aug 0.6193 -0.1633 0.2711 0.6683 Sep 0.5943 -0.1566 0.2632 0.6686 Oct 0.4938 -0.1179 0.2499 0.6927 Nov 0.4419 -0.1250 0.2349 0.6914 Dec 0.4119 -0.1221 0.2242 0.6815 -------------------------------------------- All 0.5154 -0.1342 0.2422 0.6853 📄 Download Statistics Report (txt) · 📄 YAML\nTEMP_3D Metric WOA RMSE 2.9556 Bias -1.3505 MAE 2.1699 Corr 0.8019 Model mean 7.8566 Obs mean 9.2071 View Full Statistics Report ################################################################################ TEMP Validation Statistics ################################################################################ Format: 1.1 Created: 2026-05-29 11:42:11 Author: RT Project: OceanICU Institute: BB Area: AMM7 Experiment: CMEMS_prof ################################################################################ ================================================================================ Period: 2016-2022 | Model: pyGETM ================================================================================ Analysed: 2026-05-29 11:42:11 --- WOA --- RMSE: 2.9556 Bias: -1.3505 MAE: 2.1699 Correlation: 0.8019 N points: 118,126,680 Model mean: 7.8566 Obs mean: 9.2071 Model std: 4.3879 Obs std: 3.7159 Error distribution: Min: -8.9401 5th pct: -6.0232 25th pct: -3.2092 Median: -0.7217 75th pct: +0.3321 95th pct: +2.2068 Max: +13.8816 Monthly breakdown: Month RMSE Bias MAE Corr -------------------------------------------- Jan 2.8248 -1.4380 2.0101 0.7705 Feb 2.7992 -1.4647 1.9652 0.7643 Mar 2.8077 -1.4544 1.9721 0.7538 Apr 2.8224 -1.4370 1.9971 0.7553 May 2.8810 -1.3341 2.1024 0.7646 Jun 3.0204 -1.1987 2.2799 0.7864 Jul 3.1510 -1.1455 2.4029 0.8120 Aug 3.1883 -1.1554 2.4506 0.8296 Sep 3.0976 -1.2775 2.3705 0.8385 Oct 3.0053 -1.4284 2.2450 0.8312 Nov 2.9481 -1.4151 2.1577 0.8044 Dec 2.8862 -1.4573 2.0852 0.7872 -------------------------------------------- All 2.9556 -1.3505 2.1699 0.8019 ================================================================================ Period: 2016-2023 | Model: pyGETM ================================================================================ Analysed: 2026-05-29 15:57:33 --- WOA --- RMSE: 2.9639 Bias: -1.3276 MAE: 2.1791 Correlation: 0.8009 N points: 133,595,650 Model mean: 7.8810 Obs mean: 9.2086 Model std: 4.4148 Obs std: 3.7188 Error distribution: Min: -8.9401 5th pct: -6.0291 25th pct: -3.2066 Median: -0.6985 75th pct: +0.3801 95th pct: +2.2626 Max: +13.8816 Monthly breakdown: Month RMSE Bias MAE Corr -------------------------------------------- Jan 2.8371 -1.4266 2.0192 0.7679 Feb 2.8114 -1.4545 1.9757 0.7617 Mar 2.8174 -1.4487 1.9805 0.7521 Apr 2.8272 -1.4180 2.0019 0.7538 May 2.8878 -1.3073 2.1116 0.7633 Jun 3.0450 -1.1444 2.3097 0.7840 Jul 3.1569 -1.1091 2.4118 0.8114 Aug 3.1875 -1.1336 2.4507 0.8293 Sep 3.1092 -1.2443 2.3844 0.8374 Oct 3.0093 -1.4022 2.2508 0.8306 Nov 2.9467 -1.4014 2.1566 0.8044 Dec 2.8862 -1.4573 2.0852 0.7872 -------------------------------------------- All 2.9639 -1.3276 2.1791 0.8009 📄 Download Statistics Report (txt) · 📄 YAML\nPlots Full Period Salinity at 5 m depth — model vs observations comparison\nSalinity at 5 m depth — spatial distribution of statistics\nSalinity at 50 m depth — model vs observations comparison\nSalinity at 50 m depth — spatial distribution of statistics\nSalinity at 100 m depth — model vs observations comparison\nSalinity at 100 m depth — spatial distribution of statistics\nSalinity at 200 m depth — model vs observations comparison\nSalinity at 200 m depth — spatial distribution of statistics\nSalinity at 500 m depth — model vs observations comparison\nSalinity at 500 m depth — spatial distribution of statistics\nSalinity — monthly 3D profile statistics\nSalinity — monthly 3D Taylor diagram\nTaylor diagram\nTemperature at 5 m depth — model vs observations comparison\nTemperature at 5 m depth — spatial distribution of statistics\nTemperature at 50 m depth — model vs observations comparison\nTemperature at 50 m depth — spatial distribution of statistics\nTemperature at 100 m depth — model vs observations comparison\nTemperature at 100 m depth — spatial distribution of statistics\nTemperature at 200 m depth — model vs observations comparison\nTemperature at 200 m depth — spatial distribution of statistics\nTemperature at 500 m depth — model vs observations comparison\nTemperature at 500 m depth — spatial distribution of statistics\nTemperature — monthly 3D profile statistics\nTemperature — monthly 3D Taylor diagram\nSalinity at 5 m depth — model vs observations comparison\nSalinity at 5 m depth — spatial distribution of statistics\nSalinity at 50 m depth — model vs observations comparison\nSalinity at 50 m depth — spatial distribution of statistics\nSalinity at 100 m depth — model vs observations comparison\nSalinity at 100 m depth — spatial distribution of statistics\nSalinity at 200 m depth — model vs observations comparison\nSalinity at 200 m depth — spatial distribution of statistics\nSalinity at 500 m depth — model vs observations comparison\nSalinity at 500 m depth — spatial distribution of statistics\nSalinity — monthly 3D profile statistics\nSalinity — monthly 3D Taylor diagram\nTaylor diagram\nTemperature at 5 m depth — model vs observations comparison\nTemperature at 5 m depth — spatial distribution of statistics\nTemperature at 50 m depth — model vs observations comparison\nTemperature at 50 m depth — spatial distribution of statistics\nTemperature at 100 m depth — model vs observations comparison\nTemperature at 100 m depth — spatial distribution of statistics\nTemperature at 200 m depth — model vs observations comparison\nTemperature at 200 m depth — spatial distribution of statistics\nTemperature at 500 m depth — model vs observations comparison\nTemperature at 500 m depth — spatial distribution of statistics\nTemperature — monthly 3D profile statistics\nTemperature — monthly 3D Taylor diagram\nICES Point Profiles Statistics ALK Metric ICES point observations RMSE 439.9290 Bias -356.5721 MAE 356.5721 Corr 0.1296 Model mean 1988.7083 Obs mean 2345.2805 View Full Statistics Report ################################################################################ ALK Profile Validation Statistics ################################################################################ Format: 1.1 Created: 2026-05-29 12:43:26 Area: AMM7 Experiment: CMEMS_prof ################################################################################ ================================================================================ Period: 2016-2022 | Model: pyGETM ================================================================================ Analysed: 2026-05-29 12:57:33 --- ICES point observations --- RMSE: 439.9290 Bias: -356.5721 MAE: 356.5721 Correlation: 0.1296 N points: 2,294 N profiles: 475 Model mean: 1988.7083 Obs mean: 2345.2805 Model std: 256.5190 Obs std: 74.7763 Error distribution: Min: -1658.1777 5th pct: -869.3167 25th pct: -421.3186 Median: -222.4875 75th pct: -199.1828 95th pct: -179.6012 Max: -160.0031 Statistics by depth: Depth N Bias RMSE Corr ------------------------------------------------------ 0-10m 928 -489.1728 545.6056 0.2332 10-25m 114 -771.2173 892.4272 0.3431 25-50m 86 -420.0974 559.5209 0.1613 50-100m 81 -230.3312 234.1705 0.2559 100-200m 123 -212.7691 213.5565 0.4549 200-500m 173 -203.1246 203.3161 0.1229 500-1000m 239 -210.1410 211.3882 0.2342 ================================================================================ Period: 2016-2023 | Model: pyGETM ================================================================================ Analysed: 2026-05-29 15:17:44 --- ICES point observations --- RMSE: 434.2403 Bias: -354.1481 MAE: 354.1481 Correlation: 0.0576 N points: 2,686 N profiles: 475 Model mean: 1993.0003 Obs mean: 2347.1484 Model std: 244.8000 Obs std: 72.7357 Error distribution: Min: -1658.1777 5th pct: -852.3038 25th pct: -425.1389 Median: -222.4875 75th pct: -198.0753 95th pct: -179.5686 Max: -160.0031 Statistics by depth: Depth N Bias RMSE Corr ------------------------------------------------------ 0-10m 1,141 -483.6911 539.1833 0.1506 10-25m 122 -737.2087 865.1765 0.3563 25-50m 101 -389.4283 522.8791 0.1746 50-100m 92 -228.1082 231.6661 0.2698 100-200m 141 -211.5554 212.3143 0.4712 200-500m 202 -202.1531 202.3400 0.0968 500-1000m 278 -207.6120 208.8067 0.2578 📄 Download Statistics Report (txt) · 📄 YAML\nAMON Metric ICES point observations RMSE 2.3833 Bias -0.7501 MAE 1.0991 Corr 0.2028 Model mean 0.7025 Obs mean 1.4526 View Full Statistics Report ################################################################################ AMON Profile Validation Statistics ################################################################################ Format: 1.1 Created: 2026-05-29 12:43:37 Area: AMM7 Experiment: CMEMS_prof ################################################################################ ================================================================================ Period: 2016-2022 | Model: pyGETM ================================================================================ Analysed: 2026-05-29 12:57:40 --- ICES point observations --- RMSE: 2.3833 Bias: -0.7501 MAE: 1.0991 Correlation: 0.2028 N points: 2,107 N profiles: 1,601 Model mean: 0.7025 Obs mean: 1.4526 Model std: 0.3778 Obs std: 2.3089 Error distribution: Min: -23.3105 5th pct: -5.0493 25th pct: -0.7219 Median: +0.0438 75th pct: +0.2971 95th pct: +0.6818 Max: +1.8140 Statistics by depth: Depth N Bias RMSE Corr ------------------------------------------------------ 0-10m 1,683 -0.9242 2.6521 0.1355 10-25m 170 +0.0830 0.4020 0.1790 25-50m 157 -0.1333 0.6422 0.3791 50-100m 59 -0.2975 0.7560 0.5765 100-200m 31 -0.0239 0.3311 0.3712 200-500m 7 +0.0105 0.1747 -0.4149 ================================================================================ Period: 2016-2023 | Model: pyGETM ================================================================================ Analysed: 2026-05-29 15:17:56 --- ICES point observations --- RMSE: 2.3833 Bias: -0.7501 MAE: 1.0991 Correlation: 0.2028 N points: 2,107 N profiles: 1,601 Model mean: 0.7025 Obs mean: 1.4526 Model std: 0.3778 Obs std: 2.3089 Error distribution: Min: -23.3105 5th pct: -5.0493 25th pct: -0.7219 Median: +0.0438 75th pct: +0.2971 95th pct: +0.6818 Max: +1.8140 Statistics by depth: Depth N Bias RMSE Corr ------------------------------------------------------ 0-10m 1,683 -0.9242 2.6521 0.1355 10-25m 170 +0.0830 0.4020 0.1790 25-50m 157 -0.1333 0.6422 0.3791 50-100m 59 -0.2975 0.7560 0.5765 100-200m 31 -0.0239 0.3311 0.3712 200-500m 7 +0.0105 0.1747 -0.4149 📄 Download Statistics Report (txt) · 📄 YAML\nDOXY Metric ICES point observations RMSE 22.3934 Bias +0.8583 MAE 16.5486 Corr 0.7203 Model mean 261.3178 Obs mean 260.4595 View Full Statistics Report ################################################################################ DOXY Profile Validation Statistics ################################################################################ Format: 1.1 Created: 2026-05-29 12:42:18 Area: AMM7 Experiment: CMEMS_prof ################################################################################ ================================================================================ Period: 2016-2022 | Model: pyGETM ================================================================================ Analysed: 2026-05-29 12:56:38 --- ICES point observations --- RMSE: 22.3934 Bias: +0.8583 MAE: 16.5486 Correlation: 0.7203 N points: 788,493 N profiles: 8,867 Model mean: 261.3178 Obs mean: 260.4595 Model std: 25.8885 Obs std: 31.9997 Error distribution: Min: -265.9409 5th pct: -30.1132 25th pct: -12.6728 Median: -0.2059 75th pct: +13.1636 95th pct: +38.0367 Max: +218.3087 Statistics by depth: Depth N Bias RMSE Corr ------------------------------------------------------ 0-10m 72,290 +5.3826 24.0454 0.7731 10-25m 94,367 +5.0515 25.7062 0.6569 25-50m 109,714 +4.4188 26.3749 0.6357 50-100m 111,067 +2.5140 20.9476 0.6903 100-200m 81,293 -3.2196 17.2519 0.6607 200-500m 119,756 -7.0123 18.9934 0.7423 500-1000m 107,712 +6.0834 23.6192 0.8761 ================================================================================ Period: 2016-2023 | Model: pyGETM ================================================================================ Analysed: 2026-05-29 15:16:21 --- ICES point observations --- RMSE: 25.9825 Bias: +1.5185 MAE: 18.2289 Correlation: 0.6758 N points: 968,855 N profiles: 10,067 Model mean: 258.8958 Obs mean: 257.3773 Model std: 29.5040 Obs std: 34.0768 Error distribution: Min: -925.7754 5th pct: -31.9299 25th pct: -12.2544 Median: +0.6979 75th pct: +15.0950 95th pct: +44.0164 Max: +218.3087 Statistics by depth: Depth N Bias RMSE Corr ------------------------------------------------------ 0-10m 93,782 +4.8218 24.5506 0.7772 10-25m 114,682 +2.3173 31.1520 0.5947 25-50m 129,274 +1.3963 33.6985 0.5383 50-100m 130,004 +0.3437 24.7913 0.6046 100-200m 97,589 -4.1813 18.3323 0.6296 200-500m 148,259 -5.2592 18.7115 0.7438 500-1000m 144,578 +13.0451 28.4666 0.8610 📄 Download Statistics Report (txt) · 📄 YAML\nNTRA Metric ICES point observations RMSE 15.8629 Bias +6.7019 MAE 7.7606 Corr 0.4607 Model mean 14.9563 Obs mean 8.2544 View Full Statistics Report ################################################################################ NTRA Profile Validation Statistics ################################################################################ Format: 1.1 Created: 2026-05-29 12:42:37 Area: AMM7 Experiment: CMEMS_prof ################################################################################ ================================================================================ Period: 2016-2022 | Model: pyGETM ================================================================================ Analysed: 2026-05-29 12:56:49 --- ICES point observations --- RMSE: 15.8629 Bias: +6.7019 MAE: 7.7606 Correlation: 0.4607 N points: 10,883 N profiles: 5,542 Model mean: 14.9563 Obs mean: 8.2544 Model std: 16.1523 Obs std: 8.5484 Error distribution: Min: -129.2255 5th pct: -2.3557 25th pct: -0.3159 Median: +1.3672 75th pct: +6.0449 95th pct: +40.9349 Max: +128.8937 Statistics by depth: Depth N Bias RMSE Corr ------------------------------------------------------ 0-10m 5,725 +11.1841 21.5109 0.4620 10-25m 1,177 +3.2673 5.7497 0.7565 25-50m 1,295 +2.8919 4.9329 0.3339 50-100m 911 +1.9035 3.9987 0.2689 100-200m 468 +0.0825 2.3909 0.5060 200-500m 437 -0.4805 1.4656 0.6827 500-1000m 408 -0.5264 1.1572 0.6690 ================================================================================ Period: 2016-2023 | Model: pyGETM ================================================================================ Analysed: 2026-05-29 15:16:40 --- ICES point observations --- RMSE: 16.6487 Bias: +7.1615 MAE: 8.1378 Correlation: 0.4090 N points: 12,333 N profiles: 6,264 Model mean: 15.0545 Obs mean: 7.8930 Model std: 16.3845 Obs std: 8.2420 Error distribution: Min: -129.2255 5th pct: -2.2704 25th pct: -0.2108 Median: +1.4343 75th pct: +6.3585 95th pct: +41.9776 Max: +128.8937 Statistics by depth: Depth N Bias RMSE Corr ------------------------------------------------------ 0-10m 6,441 +10.6244 21.1857 0.4437 10-25m 1,539 +6.5287 14.3765 0.2647 25-50m 1,508 +4.4223 9.7176 -0.0397 50-100m 999 +3.1947 7.6536 -0.0845 100-200m 525 +0.7915 3.5575 0.2238 200-500m 451 -0.4155 1.5064 0.6637 500-1000m 408 -0.5264 1.1572 0.6690 📄 Download Statistics Report (txt) · 📄 YAML\nPH Metric ICES point observations RMSE 0.2863 Bias -0.1334 MAE 0.2114 Corr -0.0340 Model mean 7.9324 Obs mean 8.0658 View Full Statistics Report ################################################################################ PH Profile Validation Statistics ################################################################################ Format: 1.1 Created: 2026-05-29 12:57:24 Area: AMM7 Experiment: CMEMS_prof ################################################################################ ================================================================================ Period: 2016-2022 | Model: pyGETM ================================================================================ Analysed: 2026-05-29 12:57:24 --- ICES point observations --- RMSE: 0.2863 Bias: -0.1334 MAE: 0.2114 Correlation: -0.0340 N points: 3,644 N profiles: 2,548 Model mean: 7.9324 Obs mean: 8.0658 Model std: 0.1308 Obs std: 0.2126 Error distribution: Min: -1.3892 5th pct: -0.5361 25th pct: -0.2415 Median: -0.1395 75th pct: -0.0347 95th pct: +0.2048 Max: +1.4513 Statistics by depth: Depth N Bias RMSE Corr ------------------------------------------------------ 0-10m 2,751 -0.1009 0.2829 -0.0432 10-25m 442 -0.2643 0.3390 0.0173 25-50m 257 -0.2307 0.2923 0.4627 50-100m 57 -0.1705 0.1767 0.1463 100-200m 87 -0.1612 0.1655 0.3784 200-500m 50 -0.1742 0.1767 0.4254 ================================================================================ Period: 2016-2023 | Model: pyGETM ================================================================================ Analysed: 2026-05-29 15:17:28 --- ICES point observations --- RMSE: 0.7866 Bias: -0.0468 MAE: 0.3079 Correlation: 0.0013 N points: 3,985 N profiles: 2,667 Model mean: 8.0205 Obs mean: 8.0673 Model std: 0.7584 Obs std: 0.2048 Error distribution: Min: -2.0356 5th pct: -0.5489 25th pct: -0.2418 Median: -0.1414 75th pct: -0.0306 95th pct: +0.4633 Max: +6.9172 Statistics by depth: Depth N Bias RMSE Corr ------------------------------------------------------ 0-10m 2,879 -0.0792 0.4558 -0.0025 10-25m 542 -0.0067 1.2990 -0.0049 25-50m 319 -0.0146 1.1124 0.0351 50-100m 70 +0.1671 1.3875 -0.0348 100-200m 111 +0.2074 1.4985 -0.1372 200-500m 64 +0.2388 1.6496 -0.2301 📄 Download Statistics Report (txt) · 📄 YAML\nPHOS Metric ICES point observations RMSE 0.4875 Bias -0.0522 MAE 0.2134 Corr 0.5182 Model mean 0.5518 Obs mean 0.6039 View Full Statistics Report ################################################################################ PHOS Profile Validation Statistics ################################################################################ Format: 1.1 Created: 2026-05-29 12:42:54 Area: AMM7 Experiment: CMEMS_prof ################################################################################ ================================================================================ Period: 2016-2022 | Model: pyGETM ================================================================================ Analysed: 2026-05-29 12:56:58 --- ICES point observations --- RMSE: 0.4875 Bias: -0.0522 MAE: 0.2134 Correlation: 0.5182 N points: 12,705 N profiles: 6,166 Model mean: 0.5518 Obs mean: 0.6039 Model std: 0.3080 Obs std: 0.5665 Error distribution: Min: -12.9906 5th pct: -0.3922 25th pct: -0.1232 Median: -0.0167 75th pct: +0.0968 95th pct: +0.4117 Max: +1.2841 Statistics by depth: Depth N Bias RMSE Corr ------------------------------------------------------ 0-10m 6,471 -0.0116 0.4149 0.3373 10-25m 1,472 +0.0606 0.2413 0.5692 25-50m 1,327 -0.0007 0.2995 0.2395 50-100m 876 -0.1359 0.4394 0.3638 100-200m 550 -0.1842 0.4711 0.4350 200-500m 507 -0.3429 0.9172 0.2174 500-1000m 535 -0.4458 1.2672 0.0601 ================================================================================ Period: 2016-2023 | Model: pyGETM ================================================================================ Analysed: 2026-05-29 15:16:56 --- ICES point observations --- RMSE: 0.4700 Bias: -0.0315 MAE: 0.2150 Correlation: 0.4898 N points: 15,065 N profiles: 7,364 Model mean: 0.5467 Obs mean: 0.5782 Model std: 0.3052 Obs std: 0.5357 Error distribution: Min: -12.9906 5th pct: -0.3779 25th pct: -0.1195 Median: -0.0094 75th pct: +0.1132 95th pct: +0.4419 Max: +4.7662 Statistics by depth: Depth N Bias RMSE Corr ------------------------------------------------------ 0-10m 7,749 -0.0160 0.3956 0.3473 10-25m 2,001 +0.1060 0.2831 0.4364 25-50m 1,656 +0.0554 0.3570 0.0269 50-100m 990 -0.0953 0.4608 0.1674 100-200m 622 -0.1671 0.4459 0.3925 200-500m 526 -0.3326 0.9014 0.2164 500-1000m 540 -0.4417 1.2614 0.0552 📄 Download Statistics Report (txt) · 📄 YAML\nPSAL Metric ICES point observations RMSE 0.7536 Bias +0.0227 MAE 0.3297 Corr 0.8350 Model mean 34.8328 Obs mean 34.8101 View Full Statistics Report ################################################################################ PSAL Profile Validation Statistics ################################################################################ Format: 1.1 Created: 2026-05-29 12:41:38 Area: AMM7 Experiment: CMEMS_prof ################################################################################ ================================================================================ Period: 2016-2022 | Model: pyGETM ================================================================================ Analysed: 2026-05-29 12:56:08 --- ICES point observations --- RMSE: 0.7536 Bias: +0.0227 MAE: 0.3297 Correlation: 0.8350 N points: 3,976,738 N profiles: 28,570 Model mean: 34.8328 Obs mean: 34.8101 Model std: 1.3513 Obs std: 1.2492 Error distribution: Min: -15.4042 5th pct: -0.9938 25th pct: -0.0106 Median: +0.0993 75th pct: +0.2458 95th pct: +0.5012 Max: +35.2795 Statistics by depth: Depth N Bias RMSE Corr ------------------------------------------------------ 0-10m 253,416 -0.1771 2.2775 0.8047 10-25m 378,237 -0.1917 1.1654 0.8180 25-50m 514,604 -0.0299 0.6984 0.7874 50-100m 691,762 +0.0608 0.4015 0.7658 100-200m 603,639 +0.0999 0.2137 0.7348 200-500m 682,193 +0.1402 0.2048 0.5686 500-1000m 507,812 +0.0297 0.1327 0.7549 ================================================================================ Period: 2016-2023 | Model: pyGETM ================================================================================ Analysed: 2026-05-29 15:15:38 --- ICES point observations --- RMSE: 0.9171 Bias: -0.0312 MAE: 0.3752 Correlation: 0.8203 N points: 4,458,918 N profiles: 32,108 Model mean: 34.7490 Obs mean: 34.7803 Model std: 1.5980 Obs std: 1.3802 Error distribution: Min: -36.8340 5th pct: -1.2614 25th pct: -0.0252 Median: +0.0877 75th pct: +0.2414 95th pct: +0.4931 Max: +35.2795 Statistics by depth: Depth N Bias RMSE Corr ------------------------------------------------------ 0-10m 287,585 -0.3847 2.6196 0.7927 10-25m 420,641 -0.3763 1.5529 0.7890 25-50m 566,769 -0.1348 0.9469 0.7471 50-100m 760,775 +0.0236 0.4754 0.7422 100-200m 677,929 +0.0958 0.2211 0.7298 200-500m 777,735 +0.1370 0.2072 0.5370 500-1000m 584,330 +0.0157 0.1449 0.7318 📄 Download Statistics Report (txt) · 📄 YAML\nSLCA Metric ICES point observations RMSE 12.9218 Bias +4.7083 MAE 6.2643 Corr 0.3703 Model mean 10.6153 Obs mean 5.9071 View Full Statistics Report ################################################################################ SLCA Profile Validation Statistics ################################################################################ Format: 1.1 Created: 2026-05-29 12:43:09 Area: AMM7 Experiment: CMEMS_prof ################################################################################ ================================================================================ Period: 2016-2022 | Model: pyGETM ================================================================================ Analysed: 2026-05-29 12:57:08 --- ICES point observations --- RMSE: 12.9218 Bias: +4.7083 MAE: 6.2643 Correlation: 0.3703 N points: 12,046 N profiles: 6,191 Model mean: 10.6153 Obs mean: 5.9071 Model std: 12.2485 Obs std: 8.4556 Error distribution: Min: -223.1672 5th pct: -3.8934 25th pct: +0.4557 Median: +2.1774 75th pct: +5.0962 95th pct: +25.2903 Max: +127.4158 Statistics by depth: Depth N Bias RMSE Corr ------------------------------------------------------ 0-10m 6,436 +6.9891 17.1288 0.3180 10-25m 1,478 +2.7847 4.4472 0.6747 25-50m 1,445 +2.3150 3.6839 0.5405 50-100m 911 +2.0483 3.2783 0.2599 100-200m 468 +1.3761 2.8223 -0.1394 200-500m 438 +0.8315 3.9326 -0.4166 500-1000m 408 -2.0631 4.2891 0.1261 ================================================================================ Period: 2016-2023 | Model: pyGETM ================================================================================ Analysed: 2026-05-29 15:17:11 --- ICES point observations --- RMSE: 80.6154 Bias: +11.8343 MAE: 13.5131 Correlation: 0.0407 N points: 14,393 N profiles: 7,388 Model mean: 17.6991 Obs mean: 5.8648 Model std: 79.5998 Obs std: 9.0366 Error distribution: Min: -223.1672 5th pct: -3.4363 25th pct: +0.4273 Median: +2.2798 75th pct: +5.6815 95th pct: +36.9089 Max: +5349.7300 Statistics by depth: Depth N Bias RMSE Corr ------------------------------------------------------ 0-10m 7,713 +7.7946 23.9388 0.1856 10-25m 1,995 +16.5339 70.8511 0.0210 25-50m 1,774 +32.3608 164.7255 0.0277 50-100m 1,025 +15.4045 173.4657 0.1620 100-200m 540 +3.7140 10.5501 -0.0747 200-500m 457 +1.1073 4.2862 -0.3561 500-1000m 413 -1.9719 4.3078 0.1055 📄 Download Statistics Report (txt) · 📄 YAML\nTEMP Metric ICES point observations RMSE 1.5693 Bias +0.4750 MAE 1.1421 Corr 0.9331 Model mean 8.0598 Obs mean 7.5848 View Full Statistics Report ################################################################################ TEMP Profile Validation Statistics ################################################################################ Format: 1.1 Created: 2026-05-29 12:39:57 Area: AMM7 Experiment: CMEMS_prof ################################################################################ ================================================================================ Period: 2016-2022 | Model: pyGETM ================================================================================ Analysed: 2026-05-29 12:54:29 --- ICES point observations --- RMSE: 1.5693 Bias: +0.4750 MAE: 1.1421 Correlation: 0.9331 N points: 3,986,298 N profiles: 25,705 Model mean: 8.0598 Obs mean: 7.5848 Model std: 4.1066 Obs std: 4.0713 Error distribution: Min: -9.5860 5th pct: -2.0272 25th pct: -0.2457 Median: +0.4481 75th pct: +1.3049 95th pct: +2.7299 Max: +9.9537 Statistics by depth: Depth N Bias RMSE Corr ------------------------------------------------------ 0-10m 252,134 +0.4912 1.2004 0.9673 10-25m 379,916 +0.2349 1.3184 0.9372 25-50m 517,164 +0.3646 1.4374 0.8427 50-100m 694,702 +0.7255 1.3029 0.7868 100-200m 606,157 +0.8693 1.4400 0.7127 200-500m 683,367 +0.6611 2.1119 0.7129 500-1000m 507,782 +0.0531 2.0368 0.8757 ================================================================================ Period: 2016-2023 | Model: pyGETM ================================================================================ Analysed: 2026-05-29 15:13:40 --- ICES point observations --- RMSE: 1.6103 Bias: +0.4365 MAE: 1.1700 Correlation: 0.9270 N points: 4,468,175 N profiles: 28,970 Model mean: 8.0813 Obs mean: 7.6448 Model std: 4.0639 Obs std: 4.0472 Error distribution: Min: -9.5860 5th pct: -2.2587 25th pct: -0.2761 Median: +0.4283 75th pct: +1.2900 95th pct: +2.7338 Max: +9.9537 Statistics by depth: Depth N Bias RMSE Corr ------------------------------------------------------ 0-10m 286,078 +0.4834 1.2458 0.9654 10-25m 422,314 +0.2162 1.3405 0.9358 25-50m 569,299 +0.3442 1.4508 0.8414 50-100m 763,683 +0.7146 1.2950 0.7835 100-200m 680,438 +0.8650 1.4387 0.7000 200-500m 778,908 +0.6231 2.1611 0.6889 500-1000m 584,300 -0.0903 2.1361 0.8724 📄 Download Statistics Report (txt) · 📄 YAML\nPlots ALK — statistics vs depth profile\nAMON — statistics vs depth profile\nDOXY — statistics vs depth profile\nNTRA — statistics vs depth profile\nPH — statistics vs depth profile\nPHOS — statistics vs depth profile\nPractical Salinity — statistics vs depth profile\nSLCA — statistics vs depth profile\nTemperature — statistics vs depth profile\nALK — statistics vs depth profile\nAMON — statistics vs depth profile\nDOXY — statistics vs depth profile\nNTRA — statistics vs depth profile\nPH — statistics vs depth profile\nPHOS — statistics vs depth profile\nPractical Salinity — statistics vs depth profile\nSLCA — statistics vs depth profile\nTemperature — statistics vs depth profile\nArgo Float Profiles Statistics PSAL Metric ARGO floats RMSE 4.3246 Bias +0.5709 MAE 0.7263 Corr 0.1595 Model mean 35.2644 Obs mean 34.6935 View Full Statistics Report ################################################################################ PSAL Profile Validation Statistics ################################################################################ Format: 1.1 Created: 2026-05-29 16:36:18 Area: AMM7 Experiment: CMEMS_prof ################################################################################ ================================================================================ Period: 2016-2023 | Model: pyGETM ================================================================================ Analysed: 2026-05-29 16:36:18 --- ARGO floats --- RMSE: 4.3246 Bias: +0.5709 MAE: 0.7263 Correlation: 0.1595 N points: 4,895,384 N profiles: 18,471 Model mean: 35.2644 Obs mean: 34.6935 Model std: 0.2787 Obs std: 4.3223 Error distribution: Min: -26.4752 5th pct: -0.3981 25th pct: -0.0672 Median: +0.0029 75th pct: +0.0719 95th pct: +0.2697 Max: +36.9157 Statistics by depth: Depth N Bias RMSE Corr ------------------------------------------------------ 0-10m 96,516 +0.4697 3.1959 0.1675 10-25m 146,016 +0.5830 3.5892 0.1349 25-50m 232,385 +0.6343 3.6990 0.1360 50-100m 424,320 +0.6702 3.8183 0.1510 100-200m 492,481 +0.6599 4.4583 0.1816 200-500m 1,074,989 +0.6384 4.6175 0.1832 500-1000m 1,117,112 +0.5099 4.5146 0.2355 📄 Download Statistics Report (txt) · 📄 YAML\nTEMP Metric ARGO floats RMSE 1.3830 Bias -0.3017 MAE 0.9641 Corr 0.9548 Model mean 7.7839 Obs mean 8.0856 View Full Statistics Report ################################################################################ TEMP Profile Validation Statistics ################################################################################ Format: 1.1 Created: 2026-05-29 16:34:00 Area: AMM7 Experiment: CMEMS_prof ################################################################################ ================================================================================ Period: 2016-2023 | Model: pyGETM ================================================================================ Analysed: 2026-05-29 16:34:00 --- ARGO floats --- RMSE: 1.3830 Bias: -0.3017 MAE: 0.9641 Correlation: 0.9548 N points: 4,895,719 N profiles: 18,471 Model mean: 7.7839 Obs mean: 8.0856 Model std: 4.5061 Obs std: 4.4654 Error distribution: Min: -50.4401 5th pct: -2.8029 25th pct: -0.8963 Median: -0.1697 75th pct: +0.4016 95th pct: +1.6793 Max: +20.7284 Statistics by depth: Depth N Bias RMSE Corr ------------------------------------------------------ 0-10m 96,527 +0.1694 0.9843 0.9707 10-25m 146,026 -0.1189 1.2170 0.9502 25-50m 232,398 -0.1117 1.2881 0.9106 50-100m 424,337 +0.1387 1.2773 0.8928 100-200m 492,510 +0.2542 1.3819 0.9118 200-500m 1,075,125 -0.2946 1.5546 0.9182 500-1000m 1,117,248 -0.9743 1.6165 0.9462 📄 Download Statistics Report (txt) · 📄 YAML\nPlots Amm7 Argo Overview\nPractical Salinity — statistics vs depth profile\nTemperature — statistics vs depth profile\nObservations ARGO Observations — 2016-2023 ARGO Station Map\nARGO Observation Density\nARGO Hovmoller\nICES Observations — 2016-2022 ICES Station Map\nICES Observation Density\nICES Alk Hovmoller\nICES Amon Hovmoller\nICES Doxy Hovmoller\nICES Ntra Hovmoller\nICES Ph Hovmoller\nICES Phos Hovmoller\nICES PSAL Hovmoller\nICES Slca Hovmoller\nICES TEMP Hovmoller\nICES Observations — 2016-2023 ICES Station Map\nICES Observation Density\nICES Alk Hovmoller\nICES Amon Hovmoller\nICES Cphl Hovmoller\nICES Doxy Hovmoller\nICES Ntra Hovmoller\nICES Ph Hovmoller\nICES Phos Hovmoller\nICES PSAL Hovmoller\nICES Slca Hovmoller\nICES TEMP Hovmoller\nMethodology Horizontal Validation Model surface fields compared against gridded satellite products and in-situ observations.\nStatistics: RMSE, Bias, MAE, Pearson correlation.\nSpatial statistics show the error distribution across the domain.\nGridded 3D Validation Model vertical profiles compared against gridded 3D climatologies.\nStatistics: RMSE and Bias at each depth level.\nICES Point Profiles Quality-controlled hydrographic profiles from the ICES data portal (temperature, salinity, biogeochemical variables).\nArgo Float Profiles Autonomous profiling floats providing temperature and salinity profiles to 2000 m depth (Ifremer ERDDAP).\n← Back to AMM7 View All Validations →\n","permalink":"https://bolding-bruggeman.com/oceanicu_3d/validations/amm7-cmems-prof/","summary":"\u003cp\u003eHorizontal Validation results comparing model output against observations.\u003c/p\u003e\n\u003ch2 id=\"experiment-information\"\u003eExperiment Information\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eArea\u003c/strong\u003e: AMM7\n\u003cstrong\u003eExperiment\u003c/strong\u003e: CMEMS_prof\n\u003cstrong\u003eValidation Type\u003c/strong\u003e: Horizontal Validation\n\u003cstrong\u003eVariables\u003c/strong\u003e: SALT_SURFACE, TEMP_SURFACE\u003c/p\u003e\n\u003ch2 id=\"overview\"\u003eOverview\u003c/h2\u003e\n\u003ctable\u003e\n  \u003cthead\u003e\n      \u003ctr\u003e\n          \u003cth\u003eMetric\u003c/th\u003e\n          \u003cth\u003eSALT_SURFACE / CCI-SSS\u003c/th\u003e\n          \u003cth\u003eTEMP_SURFACE / OSTIA\u003c/th\u003e\n          \u003cth\u003eTEMP_SURFACE / CCI-SST\u003c/th\u003e\n      \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eRMSE\u003c/td\u003e\n          \u003ctd\u003e0.8866\u003c/td\u003e\n          \u003ctd\u003e1.0272\u003c/td\u003e\n          \u003ctd\u003e1.0031\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eBias\u003c/td\u003e\n          \u003ctd\u003e0.0802\u003c/td\u003e\n          \u003ctd\u003e0.4192\u003c/td\u003e\n          \u003ctd\u003e0.4755\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eCorr\u003c/td\u003e\n          \u003ctd\u003e0.8318\u003c/td\u003e\n          \u003ctd\u003e0.9479\u003c/td\u003e\n          \u003ctd\u003e0.9550\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eN points\u003c/td\u003e\n          \u003ctd\u003e170,735,828\u003c/td\u003e\n          \u003ctd\u003e132,856,606\u003c/td\u003e\n          \u003ctd\u003e172,965,608\u003c/td\u003e\n      \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch3 id=\"annual-statistics-trends\"\u003eAnnual Statistics Trends\u003c/h3\u003e\n\u003cp\u003e\u003cimg alt=\"Salinity (surface) — annual statistics timeseries (RMSE, bias, correlation)\" loading=\"lazy\" src=\"/validation-data/amm7-cmems-prof/physics/pyGETM/2016-2023/surface/salt_surface_timeseries_statistics.png\"\u003e\n\u003cem\u003eSalinity (surface) — annual statistics timeseries (RMSE, bias, correlation)\u003c/em\u003e\u003c/p\u003e","title":"AMM7 - Experiment CMEMS_prof"},{"content":"Horizontal Validation results comparing model output against observations.\nExperiment Information Area: AMM7 Experiment: NetSW_LW Validation Type: Horizontal Validation Variables: SALT_SURFACE, TEMP_SURFACE\nOverview Metric SALT_SURFACE / CCI-SSS TEMP_SURFACE / OSTIA TEMP_SURFACE / CCI-SST RMSE 1.0077 0.9415 0.9283 Bias 0.2858 0.4208 0.4006 Corr 0.6003 0.9627 0.9621 N points 195,106,513 151,821,276 197,655,640 Annual Statistics Trends Salinity (surface) — annual statistics timeseries (RMSE, bias, correlation)\nTemperature (surface) — annual statistics timeseries (RMSE, bias, correlation)\nHorizontal Validation Statistics SALT_SURFACE Metric CCI-SSS RMSE 1.0077 Bias +0.2858 MAE 0.4488 Corr 0.6003 Model mean 35.1821 Obs mean 34.9009 View Full Statistics Report ################################################################################ SALT_SURFACE Validation Statistics ################################################################################ Format: 1.1 Created: 2026-05-06 11:28:55 Author: RT Project: OceanICU Institute: BB Area: AMM7 Experiment: NetSW_LW ################################################################################ ================================================================================ Period: 2016-2023 | Model: pyGETM ================================================================================ Analysed: 2026-05-06 11:28:55 --- CCI-SSS --- RMSE: 1.0077 Bias: +0.2858 MAE: 0.4488 Correlation: 0.6003 N points: 195,106,513 Model mean: 35.1821 Obs mean: 34.9009 Model std: 0.9352 Obs std: 1.1772 Error distribution: Min: -32.4221 5th pct: -0.2771 25th pct: +0.0077 Median: +0.1546 75th pct: +0.4123 95th pct: +1.3204 Max: +16.3265 Monthly breakdown: Month RMSE Bias MAE Corr -------------------------------------------- Jan 0.8432 +0.2394 0.3926 0.6232 Feb 0.9136 +0.2317 0.4012 0.5853 Mar 1.0157 +0.2551 0.4435 0.5626 Apr 1.0651 +0.2812 0.4709 0.5669 May 1.0869 +0.2993 0.4697 0.6017 Jun 1.1483 +0.3362 0.4991 0.6016 Jul 1.1188 +0.3210 0.4819 0.6039 Aug 1.0879 +0.3178 0.4772 0.5964 Sep 1.0561 +0.3132 0.4666 0.5980 Oct 0.9856 +0.2984 0.4439 0.6115 Nov 0.9353 +0.2941 0.4415 0.6017 Dec 0.8550 +0.2402 0.3961 0.6195 -------------------------------------------- All 1.0077 +0.2858 0.4488 0.6003 ================================================================================ Period: 2016 | Model: pyGETM ================================================================================ Analysed: 2026-05-06 11:28:55 --- CCI-SSS --- RMSE: 0.9594 Bias: +0.3248 MAE: 0.4503 Correlation: 0.6330 N points: 24,460,506 Model mean: 35.2094 Obs mean: 34.8875 Model std: 0.8429 Obs std: 1.1664 Error distribution: Min: -25.5946 5th pct: -0.2305 25th pct: +0.0541 Median: +0.1935 75th pct: +0.4096 95th pct: +1.3452 Max: +16.3265 ================================================================================ Period: 2017 | Model: pyGETM ================================================================================ Analysed: 2026-05-06 11:28:55 --- CCI-SSS --- RMSE: 1.0479 Bias: +0.2937 MAE: 0.4354 Correlation: 0.5488 N points: 24,395,369 Model mean: 35.2175 Obs mean: 34.9268 Model std: 0.8948 Obs std: 1.1686 Error distribution: Min: -28.3040 5th pct: -0.2082 25th pct: +0.0260 Median: +0.1407 75th pct: +0.3729 95th pct: +1.3619 Max: +16.2470 ================================================================================ Period: 2018 | Model: pyGETM ================================================================================ Analysed: 2026-05-06 11:28:55 --- CCI-SSS --- RMSE: 0.9953 Bias: +0.2466 MAE: 0.4174 Correlation: 0.5908 N points: 24,338,489 Model mean: 35.1827 Obs mean: 34.9407 Model std: 0.9119 Obs std: 1.1622 Error distribution: Min: -29.8040 5th pct: -0.2883 25th pct: -0.0009 Median: +0.1349 75th pct: +0.3634 95th pct: +1.1597 Max: +15.5663 ================================================================================ Period: 2019 | Model: pyGETM ================================================================================ Analysed: 2026-05-06 11:28:55 --- CCI-SSS --- RMSE: 1.0044 Bias: +0.2971 MAE: 0.4474 Correlation: 0.5851 N points: 24,377,458 Model mean: 35.1933 Obs mean: 34.8998 Model std: 0.8936 Obs std: 1.1549 Error distribution: Min: -29.1627 5th pct: -0.2490 25th pct: +0.0209 Median: +0.1611 75th pct: +0.4125 95th pct: +1.3083 Max: +14.6261 ================================================================================ Period: 2020 | Model: pyGETM ================================================================================ Analysed: 2026-05-06 11:28:55 --- CCI-SSS --- RMSE: 1.0255 Bias: +0.3018 MAE: 0.4643 Correlation: 0.5967 N points: 24,422,636 Model mean: 35.1828 Obs mean: 34.8879 Model std: 0.9311 Obs std: 1.1916 Error distribution: Min: -29.0291 5th pct: -0.2635 25th pct: -0.0010 Median: +0.1472 75th pct: +0.4307 95th pct: +1.4081 Max: +14.5636 ================================================================================ Period: 2021 | Model: pyGETM ================================================================================ Analysed: 2026-05-06 11:28:55 --- CCI-SSS --- RMSE: 1.0262 Bias: +0.2771 MAE: 0.4437 Correlation: 0.6026 N points: 24,370,685 Model mean: 35.1523 Obs mean: 34.8807 Model std: 0.9750 Obs std: 1.2061 Error distribution: Min: -27.7744 5th pct: -0.2809 25th pct: +0.0145 Median: +0.1563 75th pct: +0.4129 95th pct: +1.2479 Max: +15.5230 ================================================================================ Period: 2022 | Model: pyGETM ================================================================================ Analysed: 2026-05-06 11:28:55 --- CCI-SSS --- RMSE: 1.0024 Bias: +0.2781 MAE: 0.4645 Correlation: 0.6167 N points: 24,370,685 Model mean: 35.1668 Obs mean: 34.8939 Model std: 1.0255 Obs std: 1.1594 Error distribution: Min: -32.4221 5th pct: -0.3130 25th pct: -0.0127 Median: +0.1576 75th pct: +0.4558 95th pct: +1.2994 Max: +12.8125 ================================================================================ Period: 2023 | Model: pyGETM ================================================================================ Analysed: 2026-05-06 11:28:55 --- CCI-SSS --- RMSE: 1.0010 Bias: +0.2671 MAE: 0.4675 Correlation: 0.6295 N points: 24,370,685 Model mean: 35.1518 Obs mean: 34.8901 Model std: 0.9913 Obs std: 1.2056 Error distribution: Min: -29.6282 5th pct: -0.3723 25th pct: -0.0433 Median: +0.1417 75th pct: +0.4433 95th pct: +1.3474 Max: +15.5347 📄 Download Statistics Report (txt) · 📄 YAML\nTEMP_SURFACE Metric OSTIA CCI-SST RMSE 0.9415 0.9283 Bias +0.4208 +0.4006 MAE 0.7398 0.7288 Corr 0.9627 0.9621 Model mean 12.2915 12.4765 Obs mean 11.8707 12.0759 View Full Statistics Report ################################################################################ TEMP_SURFACE Validation Statistics ################################################################################ Format: 1.1 Created: 2026-05-06 10:52:36 Author: RT Project: OceanICU Institute: BB Area: AMM7 Experiment: NetSW_LW ################################################################################ ================================================================================ Period: 2016-2023 | Model: pyGETM ================================================================================ Analysed: 2026-05-06 10:52:36 --- OSTIA --- RMSE: 0.9415 Bias: +0.4208 MAE: 0.7398 Correlation: 0.9627 N points: 151,821,276 Model mean: 12.2915 Obs mean: 11.8707 Model std: 3.9080 Obs std: 3.8133 Error distribution: Min: -12.9817 5th pct: -0.9061 25th pct: -0.0742 Median: +0.4324 75th pct: +0.9404 95th pct: +1.7018 Max: +9.2566 Monthly breakdown: Month RMSE Bias MAE Corr -------------------------------------------- Jan 1.0564 +0.4409 0.8227 0.9485 Feb 1.0318 +0.4161 0.7851 0.9525 Mar 0.9651 +0.3636 0.7317 0.9572 Apr 0.8632 +0.2957 0.6639 0.9652 May 0.8248 +0.3558 0.6514 0.9702 Jun 1.0194 +0.5312 0.8090 0.9593 Jul 1.0607 +0.5550 0.8423 0.9580 Aug 0.9591 +0.4249 0.7414 0.9617 Sep 0.7970 +0.2961 0.6193 0.9741 Oct 0.7889 +0.3338 0.6222 0.9745 Nov 0.9222 +0.4741 0.7408 0.9647 Dec 1.0633 +0.5592 0.8480 0.9544 -------------------------------------------- All 0.9415 +0.4208 0.7398 0.9627 --- CCI-SST --- RMSE: 0.9283 Bias: +0.4006 MAE: 0.7288 Correlation: 0.9621 N points: 197,655,640 Model mean: 12.4765 Obs mean: 12.0759 Model std: 3.7919 Obs std: 3.7509 Error distribution: Min: -14.3565 5th pct: -0.9097 25th pct: -0.1167 Median: +0.4034 75th pct: +0.9249 95th pct: +1.6919 Max: +9.3532 Monthly breakdown: Month RMSE Bias MAE Corr -------------------------------------------- Jan 1.0161 +0.4097 0.7839 0.9490 Feb 0.9931 +0.4081 0.7525 0.9531 Mar 0.9465 +0.3793 0.7199 0.9568 Apr 0.8466 +0.3059 0.6541 0.9640 May 0.8181 +0.3624 0.6459 0.9686 Jun 0.9992 +0.5039 0.7926 0.9582 Jul 1.0285 +0.5264 0.8177 0.9591 Aug 0.9547 +0.4141 0.7398 0.9626 Sep 0.8154 +0.2718 0.6339 0.9730 Oct 0.8119 +0.2914 0.6401 0.9724 Nov 0.9148 +0.4188 0.7304 0.9625 Dec 1.0519 +0.5125 0.8328 0.9511 -------------------------------------------- All 0.9283 +0.4006 0.7288 0.9621 ================================================================================ Period: 2016 | Model: pyGETM ================================================================================ Analysed: 2026-05-06 10:52:36 --- OSTIA --- RMSE: 0.8488 Bias: +0.1464 MAE: 0.6590 Correlation: 0.9602 N points: 19,016,628 Model mean: 12.0200 Obs mean: 11.8735 Model std: 3.8818 Obs std: 3.7392 Error distribution: Min: -10.8903 5th pct: -1.1494 25th pct: -0.3265 Median: +0.1762 75th pct: +0.6929 95th pct: +1.4225 Max: +6.8282 --- CCI-SST --- RMSE: 0.8102 Bias: +0.1454 MAE: 0.6280 Correlation: 0.9633 N points: 24,757,704 Model mean: 12.1967 Obs mean: 12.0513 Model std: 3.7655 Obs std: 3.7266 Error distribution: Min: -10.8550 5th pct: -1.1084 25th pct: -0.3038 Median: +0.1764 75th pct: +0.6670 95th pct: +1.3590 Max: +7.4316 ================================================================================ Period: 2017 | Model: pyGETM ================================================================================ Analysed: 2026-05-06 10:52:36 --- OSTIA --- RMSE: 0.9122 Bias: +0.4188 MAE: 0.7204 Correlation: 0.9628 N points: 18,964,670 Model mean: 12.3162 Obs mean: 11.8974 Model std: 3.7273 Obs std: 3.6558 Error distribution: Min: -6.7119 5th pct: -0.8847 25th pct: -0.0655 Median: +0.4394 75th pct: +0.9462 95th pct: +1.7174 Max: +9.2566 --- CCI-SST --- RMSE: 0.8836 Bias: +0.3842 MAE: 0.6967 Correlation: 0.9640 N points: 24,690,059 Model mean: 12.5105 Obs mean: 12.1263 Model std: 3.6457 Obs std: 3.6290 Error distribution: Min: -7.9452 5th pct: -0.9117 25th pct: -0.1069 Median: +0.3939 75th pct: +0.9053 95th pct: +1.6614 Max: +7.1168 ================================================================================ Period: 2018 | Model: pyGETM ================================================================================ Analysed: 2026-05-06 10:52:36 --- OSTIA --- RMSE: 1.0061 Bias: +0.5127 MAE: 0.7935 Correlation: 0.9615 N points: 18,964,670 Model mean: 12.1566 Obs mean: 11.6439 Model std: 4.0553 Obs std: 3.9844 Error distribution: Min: -12.2141 5th pct: -0.8627 25th pct: -0.0095 Median: +0.5263 75th pct: +1.0548 95th pct: +1.8536 Max: +8.8416 --- CCI-SST --- RMSE: 0.9916 Bias: +0.5336 MAE: 0.7786 Correlation: 0.9631 N points: 24,690,050 Model mean: 12.3377 Obs mean: 11.8041 Model std: 3.9064 Obs std: 3.8476 Error distribution: Min: -12.0296 5th pct: -0.7528 25th pct: +0.0207 Median: +0.5329 75th pct: +1.0581 95th pct: +1.8693 Max: +7.4533 ================================================================================ Period: 2019 | Model: pyGETM ================================================================================ Analysed: 2026-05-06 10:52:36 --- OSTIA --- RMSE: 0.9338 Bias: +0.4929 MAE: 0.7384 Correlation: 0.9661 N points: 18,964,670 Model mean: 12.2560 Obs mean: 11.7631 Model std: 3.7895 Obs std: 3.6817 Error distribution: Min: -8.0217 5th pct: -0.7613 25th pct: +0.0106 Median: +0.5021 75th pct: +1.0138 95th pct: +1.7466 Max: +7.6184 --- CCI-SST --- RMSE: 0.9417 Bias: +0.5068 MAE: 0.7449 Correlation: 0.9640 N points: 24,690,060 Model mean: 12.4589 Obs mean: 11.9521 Model std: 3.6799 Obs std: 3.6177 Error distribution: Min: -9.7678 5th pct: -0.7272 25th pct: -0.0094 Median: +0.5087 75th pct: +1.0421 95th pct: +1.7834 Max: +6.9756 ================================================================================ Period: 2020 | Model: pyGETM ================================================================================ Analysed: 2026-05-06 10:52:36 --- OSTIA --- RMSE: 0.9412 Bias: +0.4488 MAE: 0.7341 Correlation: 0.9642 N points: 19,016,628 Model mean: 12.2282 Obs mean: 11.7794 Model std: 3.7892 Obs std: 3.6783 Error distribution: Min: -9.9017 5th pct: -0.8316 25th pct: -0.0329 Median: +0.4633 75th pct: +0.9674 95th pct: +1.7206 Max: +7.9620 --- CCI-SST --- RMSE: 0.9430 Bias: +0.4880 MAE: 0.7398 Correlation: 0.9644 N points: 24,757,704 Model mean: 12.4062 Obs mean: 11.9182 Model std: 3.6910 Obs std: 3.6279 Error distribution: Min: -14.3298 5th pct: -0.7581 25th pct: -0.0095 Median: +0.4921 75th pct: +1.0011 95th pct: +1.7472 Max: +7.7940 ================================================================================ Period: 2021 | Model: pyGETM ================================================================================ Analysed: 2026-05-06 10:52:36 --- OSTIA --- RMSE: 1.0497 Bias: +0.5446 MAE: 0.8199 Correlation: 0.9561 N points: 18,964,670 Model mean: 12.2797 Obs mean: 11.7351 Model std: 3.9846 Obs std: 3.8776 Error distribution: Min: -11.8210 5th pct: -0.8373 25th pct: +0.0189 Median: +0.5428 75th pct: +1.1011 95th pct: +1.9431 Max: +9.0611 --- CCI-SST --- RMSE: 1.0277 Bias: +0.4997 MAE: 0.7983 Correlation: 0.9553 N points: 24,689,971 Model mean: 12.4782 Obs mean: 11.9786 Model std: 3.8665 Obs std: 3.8267 Error distribution: Min: -11.6745 5th pct: -0.8838 25th pct: -0.0684 Median: +0.4860 75th pct: +1.0571 95th pct: +1.9357 Max: +8.5444 ================================================================================ Period: 2022 | Model: pyGETM ================================================================================ Analysed: 2026-05-06 10:52:36 --- OSTIA --- RMSE: 0.8771 Bias: +0.4041 MAE: 0.6910 Correlation: 0.9691 N points: 18,964,670 Model mean: 12.4558 Obs mean: 12.0517 Model std: 3.9214 Obs std: 3.8585 Error distribution: Min: -6.8852 5th pct: -0.8434 25th pct: -0.0608 Median: +0.4250 75th pct: +0.9047 95th pct: +1.6157 Max: +7.2476 --- CCI-SST --- RMSE: 0.8663 Bias: +0.3347 MAE: 0.6819 Correlation: 0.9656 N points: 24,690,060 Model mean: 12.6361 Obs mean: 12.3015 Model std: 3.7990 Obs std: 3.7716 Error distribution: Min: -7.7442 5th pct: -0.9426 25th pct: -0.1763 Median: +0.3444 75th pct: +0.8622 95th pct: +1.6026 Max: +7.6917 ================================================================================ Period: 2023 | Model: pyGETM ================================================================================ Analysed: 2026-05-06 10:52:36 --- OSTIA --- RMSE: 0.9612 Bias: +0.3987 MAE: 0.7625 Correlation: 0.9623 N points: 18,964,670 Model mean: 12.6208 Obs mean: 12.2221 Model std: 4.0710 Obs std: 3.9821 Error distribution: Min: -12.9817 5th pct: -1.0507 25th pct: -0.1016 Median: +0.4453 75th pct: +0.9589 95th pct: +1.7080 Max: +7.5824 --- CCI-SST --- RMSE: 0.9602 Bias: +0.3125 MAE: 0.7622 Correlation: 0.9575 N points: 24,690,032 Model mean: 12.7882 Obs mean: 12.4757 Model std: 3.9403 Obs std: 3.9041 Error distribution: Min: -14.3565 5th pct: -1.1693 25th pct: -0.2715 Median: +0.3480 75th pct: +0.9166 95th pct: +1.7121 Max: +9.3532 📄 Download Statistics Report (txt) · 📄 YAML\nPlots Full Period SALT_SURFACE Salinity (surface) — monthly by year\nSalinity (surface) — monthly statistics\nCCI-SSS Salinity (surface) — CCI-SSS comparison\nSalinity (surface) — CCI-SSS monthly maps\nSalinity (surface) — CCI-SSS monthly taylor\nSalinity (surface) — CCI-SSS pdf annual\nSalinity (surface) — CCI-SSS pdf monthly\nSalinity (surface) — CCI-SSS spatial stats\nTEMP_SURFACE Temperature (surface) — monthly by year CCI-SST\nTemperature (surface) — monthly by year OSTIA\nTemperature (surface) — monthly statistics\nCCI-SST Temperature (surface) — CCI-SST comparison\nTemperature (surface) — CCI-SST monthly maps\nTemperature (surface) — CCI-SST monthly taylor\nTemperature (surface) — CCI-SST pdf annual\nTemperature (surface) — CCI-SST pdf monthly\nTemperature (surface) — CCI-SST spatial stats\nOSTIA Temperature (surface) — OSTIA comparison\nTemperature (surface) — OSTIA monthly maps\nTemperature (surface) — OSTIA monthly taylor\nTemperature (surface) — OSTIA pdf annual\nTemperature (surface) — OSTIA pdf monthly\nTemperature (surface) — OSTIA spatial stats\nTaylor diagram\nGridded 3D Validation Plots Full Period Temperature — monthly 3D Taylor diagram\nICES Point Profiles Statistics PSAL Metric ICES point observations RMSE 1.0444 Bias +0.2130 MAE 0.3195 Corr 0.6838 Model mean 34.9935 Obs mean 34.7805 View Full Statistics Report ################################################################################ PSAL Profile Validation Statistics ################################################################################ Format: 1.1 Created: 2026-05-06 12:42:23 Area: AMM7 Experiment: NetSW_LW ################################################################################ ================================================================================ Period: 2016-2023 | Model: pyGETM ================================================================================ Analysed: 2026-05-07 07:20:21 --- ICES point observations --- RMSE: 1.0444 Bias: +0.2130 MAE: 0.3195 Correlation: 0.6838 N points: 4,479,562 N profiles: 32,134 Model mean: 34.9935 Obs mean: 34.7805 Model std: 0.7693 Obs std: 1.3806 Error distribution: Min: -34.4617 5th pct: -0.2762 25th pct: -0.0024 Median: +0.1045 75th pct: +0.2258 95th pct: +0.6707 Max: +34.4926 Statistics by depth: Depth N Bias RMSE Corr ------------------------------------------------------ 0-10m 288,164 +1.2519 3.6106 0.5622 10-25m 420,745 +0.4517 1.4190 0.6832 25-50m 567,989 +0.1706 0.5162 0.7665 50-100m 763,824 +0.1251 0.2922 0.7967 100-200m 681,882 +0.0789 0.1777 0.8136 200-500m 782,467 +0.1002 0.1425 0.8359 500-1000m 586,611 +0.0630 0.1345 0.8868 📄 Download Statistics Report (txt) · 📄 YAML\nTEMP Metric ICES point observations RMSE 1.1929 Bias +0.3071 MAE 0.8469 Corr 0.9593 Model mean 7.9451 Obs mean 7.6380 View Full Statistics Report ################################################################################ TEMP Profile Validation Statistics ################################################################################ Format: 1.1 Created: 2026-05-06 12:39:49 Area: AMM7 Experiment: NetSW_LW ################################################################################ ================================================================================ Period: 2016-2023 | Model: pyGETM ================================================================================ Analysed: 2026-05-07 07:18:25 --- ICES point observations --- RMSE: 1.1929 Bias: +0.3071 MAE: 0.8469 Correlation: 0.9593 N points: 4,488,796 N profiles: 28,989 Model mean: 7.9451 Obs mean: 7.6380 Model std: 4.0341 Obs std: 4.0496 Error distribution: Min: -8.8166 5th pct: -1.4073 25th pct: -0.2566 Median: +0.2660 75th pct: +0.8738 95th pct: +2.2069 Max: +9.7904 Statistics by depth: Depth N Bias RMSE Corr ------------------------------------------------------ 0-10m 286,658 +0.3697 1.2433 0.9625 10-25m 422,418 +0.1945 1.2322 0.9463 25-50m 570,518 +0.1912 1.2322 0.8883 50-100m 766,720 +0.4023 1.0218 0.8609 100-200m 684,363 +0.3649 0.9221 0.8528 200-500m 783,657 +0.2531 1.4109 0.8521 500-1000m 586,581 +0.2439 1.2771 0.9576 📄 Download Statistics Report (txt) · 📄 YAML\nPlots Practical Salinity — statistics vs depth profile\nTemperature — statistics vs depth profile\nArgo Float Profiles Statistics PSAL Metric ARGO floats RMSE 4.3341 Bias +0.6635 MAE 0.7589 Corr 0.1747 Model mean 35.3552 Obs mean 34.6917 View Full Statistics Report ################################################################################ PSAL Profile Validation Statistics ################################################################################ Format: 1.1 Created: 2026-05-06 16:30:15 Area: AMM7 Experiment: NetSW_LW ################################################################################ ================================================================================ Period: 2016-2023 | Model: pyGETM ================================================================================ Analysed: 2026-05-06 16:30:15 --- ARGO floats --- RMSE: 4.3341 Bias: +0.6635 MAE: 0.7589 Correlation: 0.1747 N points: 4,905,728 N profiles: 18,473 Model mean: 35.3552 Obs mean: 34.6917 Model std: 0.3072 Obs std: 4.3260 Error distribution: Min: -26.4433 5th pct: -0.2524 25th pct: -0.0142 Median: +0.0582 75th pct: +0.1835 95th pct: +0.4617 Max: +36.8896 Statistics by depth: Depth N Bias RMSE Corr ------------------------------------------------------ 0-10m 97,572 +0.5858 3.2640 0.1936 10-25m 146,016 +0.7126 3.5961 0.1783 25-50m 232,397 +0.7863 3.7338 0.1202 50-100m 425,227 +0.8042 3.8500 0.1092 100-200m 495,254 +0.7264 4.4642 0.1659 200-500m 1,075,494 +0.7130 4.6170 0.1999 500-1000m 1,117,739 +0.6050 4.5116 0.2516 📄 Download Statistics Report (txt) · 📄 YAML\nTEMP Metric ARGO floats RMSE 1.3198 Bias +0.2620 MAE 0.9788 Corr 0.9609 Model mean 8.3462 Obs mean 8.0842 View Full Statistics Report ################################################################################ TEMP Profile Validation Statistics ################################################################################ Format: 1.1 Created: 2026-05-06 16:27:55 Area: AMM7 Experiment: NetSW_LW ################################################################################ ================================================================================ Period: 2016-2023 | Model: pyGETM ================================================================================ Analysed: 2026-05-06 16:27:55 --- ARGO floats --- RMSE: 1.3198 Bias: +0.2620 MAE: 0.9788 Correlation: 0.9609 N points: 4,906,063 N profiles: 18,473 Model mean: 8.3462 Obs mean: 8.0842 Model std: 4.6737 Obs std: 4.4683 Error distribution: Min: -49.6503 5th pct: -1.5851 25th pct: -0.5087 Median: +0.0598 75th pct: +1.0409 95th pct: +2.4750 Max: +20.4119 Statistics by depth: Depth N Bias RMSE Corr ------------------------------------------------------ 0-10m 97,583 +0.4209 1.0560 0.9720 10-25m 146,026 +0.3737 1.1224 0.9636 25-50m 232,410 +0.7220 1.5659 0.9118 50-100m 425,244 +0.9842 1.7337 0.8992 100-200m 495,283 +0.5425 1.5783 0.9089 200-500m 1,075,630 +0.1778 1.4003 0.9334 500-1000m 1,117,875 -0.3191 1.0309 0.9688 📄 Download Statistics Report (txt) · 📄 YAML\nPlots Amm7 Argo Argo Overview\nAMM7_ARGO — Hovmöller diagram\nAmm7 Argo Overview\nPractical Salinity — statistics vs depth profile\nTemperature — statistics vs depth profile\nObservations ARGO Observations — 2016-2023 ARGO Station Map\nARGO Observation Density\nARGO Hovmoller\nICES Observations — 2016-2022 ICES Station Map\nICES Observation Density\nICES Alk Hovmoller\nICES Amon Hovmoller\nICES Doxy Hovmoller\nICES Ntra Hovmoller\nICES Ph Hovmoller\nICES Phos Hovmoller\nICES PSAL Hovmoller\nICES Slca Hovmoller\nICES TEMP Hovmoller\nICES Observations — 2016-2023 ICES Station Map\nICES Observation Density\nICES Alk Hovmoller\nICES Amon Hovmoller\nICES Cphl Hovmoller\nICES Doxy Hovmoller\nICES Ntra Hovmoller\nICES Ph Hovmoller\nICES Phos Hovmoller\nICES PSAL Hovmoller\nICES Slca Hovmoller\nICES TEMP Hovmoller\nMethodology Horizontal Validation Model surface fields compared against gridded satellite products and in-situ observations.\nStatistics: RMSE, Bias, MAE, Pearson correlation.\nSpatial statistics show the error distribution across the domain.\nGridded 3D Validation Model vertical profiles compared against gridded 3D climatologies.\nStatistics: RMSE and Bias at each depth level.\nICES Point Profiles Quality-controlled hydrographic profiles from the ICES data portal (temperature, salinity, biogeochemical variables).\nArgo Float Profiles Autonomous profiling floats providing temperature and salinity profiles to 2000 m depth (Ifremer ERDDAP).\n← Back to AMM7 View All Validations →\n","permalink":"https://bolding-bruggeman.com/oceanicu_3d/validations/amm7-netsw-lw/","summary":"\u003cp\u003eHorizontal Validation results comparing model output against observations.\u003c/p\u003e\n\u003ch2 id=\"experiment-information\"\u003eExperiment Information\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eArea\u003c/strong\u003e: AMM7\n\u003cstrong\u003eExperiment\u003c/strong\u003e: NetSW_LW\n\u003cstrong\u003eValidation Type\u003c/strong\u003e: Horizontal Validation\n\u003cstrong\u003eVariables\u003c/strong\u003e: SALT_SURFACE, TEMP_SURFACE\u003c/p\u003e\n\u003ch2 id=\"overview\"\u003eOverview\u003c/h2\u003e\n\u003ctable\u003e\n  \u003cthead\u003e\n      \u003ctr\u003e\n          \u003cth\u003eMetric\u003c/th\u003e\n          \u003cth\u003eSALT_SURFACE / CCI-SSS\u003c/th\u003e\n          \u003cth\u003eTEMP_SURFACE / OSTIA\u003c/th\u003e\n          \u003cth\u003eTEMP_SURFACE / CCI-SST\u003c/th\u003e\n      \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eRMSE\u003c/td\u003e\n          \u003ctd\u003e1.0077\u003c/td\u003e\n          \u003ctd\u003e0.9415\u003c/td\u003e\n          \u003ctd\u003e0.9283\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eBias\u003c/td\u003e\n          \u003ctd\u003e0.2858\u003c/td\u003e\n          \u003ctd\u003e0.4208\u003c/td\u003e\n          \u003ctd\u003e0.4006\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eCorr\u003c/td\u003e\n          \u003ctd\u003e0.6003\u003c/td\u003e\n          \u003ctd\u003e0.9627\u003c/td\u003e\n          \u003ctd\u003e0.9621\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eN points\u003c/td\u003e\n          \u003ctd\u003e195,106,513\u003c/td\u003e\n          \u003ctd\u003e151,821,276\u003c/td\u003e\n          \u003ctd\u003e197,655,640\u003c/td\u003e\n      \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch3 id=\"annual-statistics-trends\"\u003eAnnual Statistics Trends\u003c/h3\u003e\n\u003cp\u003e\u003cimg alt=\"Salinity (surface) — annual statistics timeseries (RMSE, bias, correlation)\" loading=\"lazy\" src=\"/validation-data/amm7-netsw-lw/physics/pyGETM/2016-2023/surface/salt_surface_timeseries_statistics.png\"\u003e\n\u003cem\u003eSalinity (surface) — annual statistics timeseries (RMSE, bias, correlation)\u003c/em\u003e\u003c/p\u003e","title":"AMM7 - Experiment NetSW_LW"},{"content":"Horizontal Validation results comparing model output against observations.\nExperiment Information Area: AMM7 Experiment: ObsKd Validation Type: Horizontal Validation Variables: SALT_SURFACE, TEMP_SURFACE\nOverview Metric SALT_SURFACE / CCI-SSS TEMP_SURFACE / OSTIA TEMP_SURFACE / CCI-SST RMSE 1.0175 0.9880 0.9801 Bias 0.3028 0.5735 0.5491 Corr 0.5923 0.9654 0.9639 N points 195,106,513 151,821,276 197,655,640 Annual Statistics Trends Salinity (surface) — annual statistics timeseries (RMSE, bias, correlation)\nTemperature (surface) — annual statistics timeseries (RMSE, bias, correlation)\nHorizontal Validation Statistics SALT_SURFACE Metric CCI-SSS RMSE 1.0175 Bias +0.3028 MAE 0.4565 Corr 0.5923 Model mean 35.1992 Obs mean 34.9009 View Full Statistics Report ################################################################################ SALT_SURFACE Validation Statistics ################################################################################ Format: 1.1 Created: 2026-05-05 09:14:25 Author: RT Project: OceanICU Institute: BB Area: AMM7 Experiment: ObsKd ################################################################################ ================================================================================ Period: 2016-2023 | Model: pyGETM ================================================================================ Analysed: 2026-05-05 09:14:25 --- CCI-SSS --- RMSE: 1.0175 Bias: +0.3028 MAE: 0.4565 Correlation: 0.5923 N points: 195,106,513 Model mean: 35.1992 Obs mean: 34.9009 Model std: 0.9189 Obs std: 1.1772 Error distribution: Min: -32.4422 5th pct: -0.2566 25th pct: +0.0196 Median: +0.1659 75th pct: +0.4229 95th pct: +1.3574 Max: +16.3483 Monthly breakdown: Month RMSE Bias MAE Corr -------------------------------------------- Jan 0.8496 +0.2524 0.3990 0.6160 Feb 0.9187 +0.2439 0.4070 0.5780 Mar 1.0212 +0.2673 0.4494 0.5553 Apr 1.0706 +0.2940 0.4758 0.5608 May 1.0958 +0.3139 0.4758 0.5950 Jun 1.1599 +0.3540 0.5074 0.5942 Jul 1.1318 +0.3417 0.4905 0.5960 Aug 1.1018 +0.3402 0.4873 0.5874 Sep 1.0701 +0.3357 0.4768 0.5888 Oct 0.9992 +0.3188 0.4532 0.6019 Nov 0.9459 +0.3126 0.4502 0.5932 Dec 0.8639 +0.2571 0.4040 0.6111 -------------------------------------------- All 1.0175 +0.3028 0.4565 0.5923 ================================================================================ Period: 2016 | Model: pyGETM ================================================================================ Analysed: 2026-05-05 09:14:25 --- CCI-SSS --- RMSE: 0.9646 Bias: +0.3335 MAE: 0.4554 Correlation: 0.6298 N points: 24,460,506 Model mean: 35.2181 Obs mean: 34.8875 Model std: 0.8377 Obs std: 1.1664 Error distribution: Min: -25.6595 5th pct: -0.2215 25th pct: +0.0602 Median: +0.1992 75th pct: +0.4167 95th pct: +1.3660 Max: +16.3391 ================================================================================ Period: 2017 | Model: pyGETM ================================================================================ Analysed: 2026-05-05 09:14:25 --- CCI-SSS --- RMSE: 1.0577 Bias: +0.3108 MAE: 0.4452 Correlation: 0.5410 N points: 24,395,369 Model mean: 35.2346 Obs mean: 34.9268 Model std: 0.8842 Obs std: 1.1686 Error distribution: Min: -28.3337 5th pct: -0.1879 25th pct: +0.0357 Median: +0.1515 75th pct: +0.3853 95th pct: +1.4043 Max: +16.3483 ================================================================================ Period: 2018 | Model: pyGETM ================================================================================ Analysed: 2026-05-05 09:14:25 --- CCI-SSS --- RMSE: 1.0054 Bias: +0.2662 MAE: 0.4270 Correlation: 0.5825 N points: 24,338,489 Model mean: 35.2023 Obs mean: 34.9407 Model std: 0.8947 Obs std: 1.1622 Error distribution: Min: -29.7704 5th pct: -0.2629 25th pct: +0.0058 Median: +0.1467 75th pct: +0.3826 95th pct: +1.2028 Max: +15.6610 ================================================================================ Period: 2019 | Model: pyGETM ================================================================================ Analysed: 2026-05-05 09:14:25 --- CCI-SSS --- RMSE: 1.0175 Bias: +0.3184 MAE: 0.4582 Correlation: 0.5742 N points: 24,377,458 Model mean: 35.2146 Obs mean: 34.8998 Model std: 0.8729 Obs std: 1.1549 Error distribution: Min: -29.1042 5th pct: -0.2244 25th pct: +0.0336 Median: +0.1740 75th pct: +0.4267 95th pct: +1.3573 Max: +14.7918 ================================================================================ Period: 2020 | Model: pyGETM ================================================================================ Analysed: 2026-05-05 09:14:25 --- CCI-SSS --- RMSE: 1.0358 Bias: +0.3145 MAE: 0.4682 Correlation: 0.5868 N points: 24,422,636 Model mean: 35.1955 Obs mean: 34.8879 Model std: 0.9111 Obs std: 1.1916 Error distribution: Min: -28.9083 5th pct: -0.2460 25th pct: +0.0103 Median: +0.1524 75th pct: +0.4354 95th pct: +1.4383 Max: +14.7110 ================================================================================ Period: 2021 | Model: pyGETM ================================================================================ Analysed: 2026-05-05 09:14:25 --- CCI-SSS --- RMSE: 1.0346 Bias: +0.2895 MAE: 0.4466 Correlation: 0.5940 N points: 24,370,685 Model mean: 35.1648 Obs mean: 34.8807 Model std: 0.9546 Obs std: 1.2061 Error distribution: Min: -27.7001 5th pct: -0.2550 25th pct: +0.0255 Median: +0.1614 75th pct: +0.4111 95th pct: +1.2824 Max: +15.6702 ================================================================================ Period: 2022 | Model: pyGETM ================================================================================ Analysed: 2026-05-05 09:14:25 --- CCI-SSS --- RMSE: 1.0120 Bias: +0.2984 MAE: 0.4731 Correlation: 0.6090 N points: 24,370,685 Model mean: 35.1872 Obs mean: 34.8939 Model std: 1.0083 Obs std: 1.1594 Error distribution: Min: -32.4422 5th pct: -0.2952 25th pct: +0.0046 Median: +0.1724 75th pct: +0.4682 95th pct: +1.3366 Max: +12.9949 ================================================================================ Period: 2023 | Model: pyGETM ================================================================================ Analysed: 2026-05-05 09:14:25 --- CCI-SSS --- RMSE: 1.0128 Bias: +0.2914 MAE: 0.4785 Correlation: 0.6218 N points: 24,370,685 Model mean: 35.1762 Obs mean: 34.8901 Model std: 0.9737 Obs std: 1.2056 Error distribution: Min: -29.4798 5th pct: -0.3517 25th pct: -0.0235 Median: +0.1651 75th pct: +0.4594 95th pct: +1.3862 Max: +15.7449 📄 Download Statistics Report (txt) · 📄 YAML\nTEMP_SURFACE Metric OSTIA CCI-SST RMSE 0.9880 0.9801 Bias +0.5735 +0.5491 MAE 0.8000 0.7916 Corr 0.9654 0.9639 Model mean 12.4442 12.6250 Obs mean 11.8707 12.0759 View Full Statistics Report ################################################################################ TEMP_SURFACE Validation Statistics ################################################################################ Format: 1.1 Created: 2026-05-05 08:37:50 Author: RT Project: OceanICU Institute: BB Area: AMM7 Experiment: ObsKd ################################################################################ ================================================================================ Period: 2016-2023 | Model: pyGETM ================================================================================ Analysed: 2026-05-05 08:37:50 --- OSTIA --- RMSE: 0.9880 Bias: +0.5735 MAE: 0.8000 Correlation: 0.9654 N points: 151,821,276 Model mean: 12.4442 Obs mean: 11.8707 Model std: 3.9169 Obs std: 3.8133 Error distribution: Min: -9.6203 5th pct: -0.7238 25th pct: +0.1134 Median: +0.5970 75th pct: +1.0669 95th pct: +1.7970 Max: +9.2727 Monthly breakdown: Month RMSE Bias MAE Corr -------------------------------------------- Jan 1.0808 +0.5484 0.8596 0.9505 Feb 1.0457 +0.5221 0.8125 0.9546 Mar 0.9707 +0.4758 0.7581 0.9597 Apr 0.8691 +0.4305 0.6980 0.9681 May 0.8722 +0.5290 0.7171 0.9733 Jun 1.1068 +0.7263 0.9085 0.9626 Jul 1.1429 +0.7507 0.9392 0.9620 Aug 1.0290 +0.6233 0.8285 0.9653 Sep 0.8612 +0.4850 0.6872 0.9761 Oct 0.8464 +0.4941 0.6820 0.9765 Nov 0.9771 +0.6104 0.8016 0.9672 Dec 1.1088 +0.6802 0.9057 0.9570 -------------------------------------------- All 0.9880 +0.5735 0.8000 0.9654 --- CCI-SST --- RMSE: 0.9801 Bias: +0.5491 MAE: 0.7916 Correlation: 0.9639 N points: 197,655,640 Model mean: 12.6250 Obs mean: 12.0759 Model std: 3.8098 Obs std: 3.7509 Error distribution: Min: -10.7849 5th pct: -0.7569 25th pct: +0.0527 Median: +0.5712 75th pct: +1.0612 95th pct: +1.7903 Max: +9.4216 Monthly breakdown: Month RMSE Bias MAE Corr -------------------------------------------- Jan 1.0498 +0.5102 0.8247 0.9498 Feb 1.0191 +0.5066 0.7879 0.9542 Mar 0.9667 +0.4847 0.7566 0.9585 Apr 0.8656 +0.4342 0.6941 0.9664 May 0.8757 +0.5291 0.7179 0.9710 Jun 1.0867 +0.6945 0.8938 0.9609 Jul 1.1134 +0.7199 0.9158 0.9623 Aug 1.0294 +0.6107 0.8306 0.9653 Sep 0.8765 +0.4594 0.6977 0.9745 Oct 0.8658 +0.4523 0.6938 0.9739 Nov 0.9715 +0.5530 0.7898 0.9641 Dec 1.1040 +0.6290 0.8932 0.9523 -------------------------------------------- All 0.9801 +0.5491 0.7916 0.9639 ================================================================================ Period: 2016 | Model: pyGETM ================================================================================ Analysed: 2026-05-05 08:37:50 --- OSTIA --- RMSE: 0.8748 Bias: +0.3147 MAE: 0.6865 Correlation: 0.9631 N points: 19,016,628 Model mean: 12.1882 Obs mean: 11.8735 Model std: 3.9222 Obs std: 3.7392 Error distribution: Min: -8.3486 5th pct: -0.9606 25th pct: -0.1295 Median: +0.3515 75th pct: +0.8365 95th pct: +1.5323 Max: +6.8076 --- CCI-SST --- RMSE: 0.8355 Bias: +0.3022 MAE: 0.6571 Correlation: 0.9655 N points: 24,757,704 Model mean: 12.3535 Obs mean: 12.0513 Model std: 3.8110 Obs std: 3.7266 Error distribution: Min: -8.7668 5th pct: -0.9364 25th pct: -0.1267 Median: +0.3387 75th pct: +0.8059 95th pct: +1.4647 Max: +7.2398 ================================================================================ Period: 2017 | Model: pyGETM ================================================================================ Analysed: 2026-05-05 08:37:50 --- OSTIA --- RMSE: 0.9663 Bias: +0.5792 MAE: 0.7845 Correlation: 0.9656 N points: 18,964,670 Model mean: 12.4767 Obs mean: 11.8974 Model std: 3.7331 Obs std: 3.6558 Error distribution: Min: -5.9293 5th pct: -0.6806 25th pct: +0.1242 Median: +0.6063 75th pct: +1.0789 95th pct: +1.8037 Max: +9.2727 --- CCI-SST --- RMSE: 0.9406 Bias: +0.5303 MAE: 0.7611 Correlation: 0.9652 N points: 24,690,059 Model mean: 12.6566 Obs mean: 12.1263 Model std: 3.6549 Obs std: 3.6290 Error distribution: Min: -6.1345 5th pct: -0.7521 25th pct: +0.0481 Median: +0.5517 75th pct: +1.0438 95th pct: +1.7568 Max: +7.2300 ================================================================================ Period: 2018 | Model: pyGETM ================================================================================ Analysed: 2026-05-05 08:37:50 --- OSTIA --- RMSE: 1.0824 Bias: +0.6773 MAE: 0.8737 Correlation: 0.9629 N points: 18,964,670 Model mean: 12.3212 Obs mean: 11.6439 Model std: 4.0814 Obs std: 3.9844 Error distribution: Min: -9.4665 5th pct: -0.6763 25th pct: +0.1719 Median: +0.6902 75th pct: +1.1974 95th pct: +2.0127 Max: +8.7800 --- CCI-SST --- RMSE: 1.0759 Bias: +0.6882 MAE: 0.8656 Correlation: 0.9638 N points: 24,690,050 Model mean: 12.4923 Obs mean: 11.8041 Model std: 3.9335 Obs std: 3.8476 Error distribution: Min: -10.3517 5th pct: -0.5921 25th pct: +0.1738 Median: +0.6925 75th pct: +1.2065 95th pct: +2.0252 Max: +7.5133 ================================================================================ Period: 2019 | Model: pyGETM ================================================================================ Analysed: 2026-05-05 08:37:50 --- OSTIA --- RMSE: 0.9843 Bias: +0.6340 MAE: 0.8057 Correlation: 0.9685 N points: 18,964,670 Model mean: 12.3971 Obs mean: 11.7631 Model std: 3.7751 Obs std: 3.6817 Error distribution: Min: -7.0930 5th pct: -0.5967 25th pct: +0.1798 Median: +0.6533 75th pct: +1.1225 95th pct: +1.8523 Max: +7.7173 --- CCI-SST --- RMSE: 1.0096 Bias: +0.6536 MAE: 0.8229 Correlation: 0.9658 N points: 24,690,060 Model mean: 12.6057 Obs mean: 11.9521 Model std: 3.6856 Obs std: 3.6177 Error distribution: Min: -8.5255 5th pct: -0.5823 25th pct: +0.1513 Median: +0.6740 75th pct: +1.1688 95th pct: +1.8993 Max: +7.0687 ================================================================================ Period: 2020 | Model: pyGETM ================================================================================ Analysed: 2026-05-05 08:37:50 --- OSTIA --- RMSE: 0.9518 Bias: +0.5647 MAE: 0.7737 Correlation: 0.9679 N points: 19,016,628 Model mean: 12.3441 Obs mean: 11.7794 Model std: 3.7702 Obs std: 3.6783 Error distribution: Min: -7.6856 5th pct: -0.6763 25th pct: +0.1366 Median: +0.6018 75th pct: +1.0492 95th pct: +1.7369 Max: +7.8931 --- CCI-SST --- RMSE: 0.9687 Bias: +0.6044 MAE: 0.7908 Correlation: 0.9680 N points: 24,757,704 Model mean: 12.5226 Obs mean: 11.9182 Model std: 3.6886 Obs std: 3.6279 Error distribution: Min: -10.7849 5th pct: -0.6166 25th pct: +0.1420 Median: +0.6357 75th pct: +1.0976 95th pct: +1.7724 Max: +7.5468 ================================================================================ Period: 2021 | Model: pyGETM ================================================================================ Analysed: 2026-05-05 08:37:50 --- OSTIA --- RMSE: 1.0638 Bias: +0.6675 MAE: 0.8654 Correlation: 0.9609 N points: 18,964,670 Model mean: 12.4026 Obs mean: 11.7351 Model std: 3.9754 Obs std: 3.8776 Error distribution: Min: -9.1434 5th pct: -0.6720 25th pct: +0.1952 Median: +0.6937 75th pct: +1.1853 95th pct: +1.9373 Max: +8.9868 --- CCI-SST --- RMSE: 1.0515 Bias: +0.6251 MAE: 0.8490 Correlation: 0.9593 N points: 24,689,971 Model mean: 12.6037 Obs mean: 11.9786 Model std: 3.8708 Obs std: 3.8267 Error distribution: Min: -10.2151 5th pct: -0.7470 25th pct: +0.0937 Median: +0.6473 75th pct: +1.1651 95th pct: +1.9422 Max: +8.3632 ================================================================================ Period: 2022 | Model: pyGETM ================================================================================ Analysed: 2026-05-05 08:37:50 --- OSTIA --- RMSE: 0.9530 Bias: +0.5761 MAE: 0.7734 Correlation: 0.9708 N points: 18,964,670 Model mean: 12.6277 Obs mean: 12.0517 Model std: 3.9532 Obs std: 3.8585 Error distribution: Min: -5.7222 5th pct: -0.6563 25th pct: +0.1339 Median: +0.6022 75th pct: +1.0516 95th pct: +1.7514 Max: +7.0574 --- CCI-SST --- RMSE: 0.9373 Bias: +0.5041 MAE: 0.7565 Correlation: 0.9665 N points: 24,690,060 Model mean: 12.8056 Obs mean: 12.3015 Model std: 3.8320 Obs std: 3.7716 Error distribution: Min: -7.4294 5th pct: -0.7955 25th pct: +0.0064 Median: +0.5314 75th pct: +1.0156 95th pct: +1.7358 Max: +7.6121 ================================================================================ Period: 2023 | Model: pyGETM ================================================================================ Analysed: 2026-05-05 08:37:50 --- OSTIA --- RMSE: 1.0252 Bias: +0.5751 MAE: 0.8375 Correlation: 0.9641 N points: 18,964,670 Model mean: 12.7972 Obs mean: 12.2221 Model std: 4.0758 Obs std: 3.9821 Error distribution: Min: -9.6203 5th pct: -0.8713 25th pct: +0.1036 Median: +0.6249 75th pct: +1.1112 95th pct: +1.8592 Max: +7.6242 --- CCI-SST --- RMSE: 1.0198 Bias: +0.4853 MAE: 0.8302 Correlation: 0.9580 N points: 24,690,032 Model mean: 12.9610 Obs mean: 12.4757 Model std: 3.9570 Obs std: 3.9041 Error distribution: Min: -10.1614 5th pct: -1.0397 25th pct: -0.0825 Median: +0.5423 75th pct: +1.0797 95th pct: +1.8586 Max: +9.4216 📄 Download Statistics Report (txt) · 📄 YAML\nPlots Full Period SALT_SURFACE Salinity (surface) — monthly by year\nSalinity (surface) — monthly statistics\nCCI-SSS Salinity (surface) — CCI-SSS comparison\nSalinity (surface) — CCI-SSS monthly maps\nSalinity (surface) — CCI-SSS monthly taylor\nSalinity (surface) — CCI-SSS pdf annual\nSalinity (surface) — CCI-SSS pdf monthly\nSalinity (surface) — CCI-SSS spatial stats\nTEMP_SURFACE Temperature (surface) — monthly by year CCI-SST\nTemperature (surface) — monthly by year OSTIA\nTemperature (surface) — monthly statistics\nCCI-SST Temperature (surface) — CCI-SST comparison\nTemperature (surface) — CCI-SST monthly maps\nTemperature (surface) — CCI-SST monthly taylor\nTemperature (surface) — CCI-SST pdf annual\nTemperature (surface) — CCI-SST pdf monthly\nTemperature (surface) — CCI-SST spatial stats\nOSTIA Temperature (surface) — OSTIA comparison\nTemperature (surface) — OSTIA monthly maps\nTemperature (surface) — OSTIA monthly taylor\nTemperature (surface) — OSTIA pdf annual\nTemperature (surface) — OSTIA pdf monthly\nTemperature (surface) — OSTIA spatial stats\nTaylor diagram\nGridded 3D Validation Statistics SALT_3D Metric WOA RMSE 0.4426 Bias -0.0452 MAE 0.1940 Corr 0.5436 Model mean 35.2094 Obs mean 35.2546 View Full Statistics Report ################################################################################ SALT Validation Statistics ################################################################################ Format: 1.1 Created: 2026-05-07 09:14:02 Author: RT Project: OceanICU Institute: BB Area: AMM7 Experiment: ObsKd ################################################################################ ================================================================================ Period: 2016-2023 | Model: pyGETM ================================================================================ Analysed: 2026-05-07 09:14:02 --- WOA --- RMSE: 0.4426 Bias: -0.0452 MAE: 0.1940 Correlation: 0.5436 N points: 151,275,648 Model mean: 35.2094 Obs mean: 35.2546 Model std: 0.4373 Obs std: 0.4809 Error distribution: Min: -32.8426 5th pct: -0.6107 25th pct: -0.1211 Median: -0.0059 75th pct: +0.0868 95th pct: +0.3013 Max: +16.4201 Monthly breakdown: Month RMSE Bias MAE Corr -------------------------------------------- Jan 0.4066 -0.0399 0.1863 0.5597 Feb 0.4260 -0.0365 0.1860 0.5411 Mar 0.4576 -0.0406 0.1908 0.5205 Apr 0.4738 -0.0421 0.1986 0.5295 May 0.4882 -0.0415 0.1995 0.5295 Jun 0.4890 -0.0437 0.2033 0.5361 Jul 0.4685 -0.0443 0.2050 0.5440 Aug 0.4532 -0.0475 0.1998 0.5489 Sep 0.4235 -0.0514 0.1941 0.5629 Oct 0.4118 -0.0523 0.1918 0.5631 Nov 0.4007 -0.0495 0.1875 0.5624 Dec 0.3978 -0.0526 0.1850 0.5626 -------------------------------------------- All 0.4426 -0.0452 0.1940 0.5436 📄 Download Statistics Report (txt) · 📄 YAML\nTEMP_3D Metric WOA RMSE 2.5079 Bias -0.7435 MAE 1.8060 Corr 0.8550 Model mean 7.3271 Obs mean 8.0706 View Full Statistics Report ################################################################################ TEMP Validation Statistics ################################################################################ Format: 1.1 Created: 2026-05-07 08:57:40 Author: RT Project: OceanICU Institute: BB Area: AMM7 Experiment: ObsKd ################################################################################ ================================================================================ Period: 2016-2023 | Model: pyGETM ================================================================================ Analysed: 2026-05-07 08:57:40 --- WOA --- RMSE: 2.5079 Bias: -0.7435 MAE: 1.8060 Correlation: 0.8550 N points: 151,275,648 Model mean: 7.3271 Obs mean: 8.0706 Model std: 4.6170 Obs std: 3.8966 Error distribution: Min: -9.6261 5th pct: -5.4293 25th pct: -1.9397 Median: -0.3349 75th pct: +0.7046 95th pct: +2.4774 Max: +13.0318 Monthly breakdown: Month RMSE Bias MAE Corr -------------------------------------------- Jan 2.4083 -0.8161 1.7212 0.8277 Feb 2.3686 -0.8246 1.6800 0.8242 Mar 2.3606 -0.8510 1.6632 0.8218 Apr 2.3636 -0.8442 1.6686 0.8252 May 2.4065 -0.7464 1.7231 0.8357 Jun 2.6069 -0.5987 1.9100 0.8458 Jul 2.7284 -0.5605 1.9919 0.8629 Aug 2.7474 -0.5713 2.0080 0.8751 Sep 2.6545 -0.6575 1.9536 0.8808 Oct 2.5148 -0.7946 1.8309 0.8787 Nov 2.4555 -0.7942 1.7841 0.8613 Dec 2.4344 -0.8629 1.7375 0.8458 -------------------------------------------- All 2.5079 -0.7435 1.8060 0.8550 📄 Download Statistics Report (txt) · 📄 YAML\nPlots Full Period Salinity at 5 m depth — model vs observations comparison\nSalinity at 5 m depth — spatial distribution of statistics\nSalinity at 50 m depth — model vs observations comparison\nSalinity at 50 m depth — spatial distribution of statistics\nSalinity at 100 m depth — model vs observations comparison\nSalinity at 100 m depth — spatial distribution of statistics\nSalinity at 200 m depth — model vs observations comparison\nSalinity at 200 m depth — spatial distribution of statistics\nSalinity at 500 m depth — model vs observations comparison\nSalinity at 500 m depth — spatial distribution of statistics\nSalinity — monthly 3D profile statistics\nSalinity — monthly 3D Taylor diagram\nTaylor diagram\nTemperature at 5 m depth — model vs observations comparison\nTemperature at 5 m depth — spatial distribution of statistics\nTemperature at 50 m depth — model vs observations comparison\nTemperature at 50 m depth — spatial distribution of statistics\nTemperature at 100 m depth — model vs observations comparison\nTemperature at 100 m depth — spatial distribution of statistics\nTemperature at 200 m depth — model vs observations comparison\nTemperature at 200 m depth — spatial distribution of statistics\nTemperature at 500 m depth — model vs observations comparison\nTemperature at 500 m depth — spatial distribution of statistics\nTemperature — monthly 3D profile statistics\nTemperature — monthly 3D Taylor diagram\nICES Point Profiles Statistics PSAL Metric ICES point observations RMSE 1.0563 Bias +0.2312 MAE 0.3243 Corr 0.6794 Model mean 35.0117 Obs mean 34.7805 View Full Statistics Report ################################################################################ PSAL Profile Validation Statistics ################################################################################ Format: 1.1 Created: 2026-05-05 09:34:58 Area: AMM7 Experiment: ObsKd ################################################################################ ================================================================================ Period: 2016-2023 | Model: pyGETM ================================================================================ Analysed: 2026-05-07 07:32:29 --- ICES point observations --- RMSE: 1.0563 Bias: +0.2312 MAE: 0.3243 Correlation: 0.6794 N points: 4,479,563 N profiles: 32,134 Model mean: 35.0117 Obs mean: 34.7805 Model std: 0.7478 Obs std: 1.3806 Error distribution: Min: -34.4254 5th pct: -0.2359 25th pct: -0.0008 Median: +0.1148 75th pct: +0.2373 95th pct: +0.7107 Max: +34.5163 Statistics by depth: Depth N Bias RMSE Corr ------------------------------------------------------ 0-10m 288,165 +1.3147 3.6461 0.5575 10-25m 420,745 +0.5004 1.4434 0.6805 25-50m 567,989 +0.2046 0.5268 0.7642 50-100m 763,824 +0.1443 0.2983 0.7917 100-200m 681,882 +0.0894 0.1803 0.8088 200-500m 782,467 +0.1038 0.1456 0.8315 500-1000m 586,611 +0.0625 0.1326 0.8897 📄 Download Statistics Report (txt) · 📄 YAML\nTEMP Metric ICES point observations RMSE 1.2204 Bias +0.4042 MAE 0.8826 Corr 0.9599 Model mean 8.0422 Obs mean 7.6380 View Full Statistics Report ################################################################################ TEMP Profile Validation Statistics ################################################################################ Format: 1.1 Created: 2026-05-05 09:32:57 Area: AMM7 Experiment: ObsKd ################################################################################ ================================================================================ Period: 2016-2023 | Model: pyGETM ================================================================================ Analysed: 2026-05-07 07:30:33 --- ICES point observations --- RMSE: 1.2204 Bias: +0.4042 MAE: 0.8826 Correlation: 0.9599 N points: 4,488,797 N profiles: 28,989 Model mean: 8.0422 Obs mean: 7.6380 Model std: 4.0834 Obs std: 4.0496 Error distribution: Min: -8.5244 5th pct: -1.3077 25th pct: -0.1882 Median: +0.3839 75th pct: +0.9835 95th pct: +2.2726 Max: +10.0534 Statistics by depth: Depth N Bias RMSE Corr ------------------------------------------------------ 0-10m 286,659 +0.5747 1.2881 0.9648 10-25m 422,418 +0.3844 1.2608 0.9479 25-50m 570,518 +0.3527 1.2652 0.8893 50-100m 766,720 +0.5227 1.0800 0.8596 100-200m 684,363 +0.4549 0.9725 0.8475 200-500m 783,657 +0.3126 1.4341 0.8499 500-1000m 586,581 +0.2544 1.2798 0.9575 📄 Download Statistics Report (txt) · 📄 YAML\nPlots Practical Salinity — statistics vs depth profile\nTemperature — statistics vs depth profile\nArgo Float Profiles Statistics PSAL Metric ARGO floats RMSE 4.3337 Bias +0.6647 MAE 0.7585 Corr 0.1756 Model mean 35.3564 Obs mean 34.6917 View Full Statistics Report ################################################################################ PSAL Profile Validation Statistics ################################################################################ Format: 1.1 Created: 2026-05-05 10:32:18 Area: AMM7 Experiment: ObsKd ################################################################################ ================================================================================ Period: 2016-2023 | Model: pyGETM ================================================================================ Analysed: 2026-05-05 10:32:18 --- ARGO floats --- RMSE: 4.3337 Bias: +0.6647 MAE: 0.7585 Correlation: 0.1756 N points: 4,905,731 N profiles: 18,473 Model mean: 35.3564 Obs mean: 34.6917 Model std: 0.3095 Obs std: 4.3260 Error distribution: Min: -26.4432 5th pct: -0.2501 25th pct: -0.0105 Median: +0.0630 75th pct: +0.1881 95th pct: +0.4346 Max: +36.8896 Statistics by depth: Depth N Bias RMSE Corr ------------------------------------------------------ 0-10m 97,575 +0.5741 3.2634 0.1919 10-25m 146,016 +0.6982 3.5875 0.1889 25-50m 232,397 +0.7782 3.7294 0.1293 50-100m 425,227 +0.8024 3.8485 0.1132 100-200m 495,254 +0.7331 4.4648 0.1663 200-500m 1,075,494 +0.7171 4.6175 0.1985 500-1000m 1,117,739 +0.6063 4.5116 0.2515 📄 Download Statistics Report (txt) · 📄 YAML\nTEMP Metric ARGO floats RMSE 1.3243 Bias +0.2999 MAE 0.9846 Corr 0.9618 Model mean 8.3841 Obs mean 8.0842 View Full Statistics Report ################################################################################ TEMP Profile Validation Statistics ################################################################################ Format: 1.1 Created: 2026-05-05 10:29:17 Area: AMM7 Experiment: ObsKd ################################################################################ ================================================================================ Period: 2016-2023 | Model: pyGETM ================================================================================ Analysed: 2026-05-05 10:29:17 --- ARGO floats --- RMSE: 1.3243 Bias: +0.2999 MAE: 0.9846 Correlation: 0.9618 N points: 4,906,066 N profiles: 18,473 Model mean: 8.3841 Obs mean: 8.0842 Model std: 4.7043 Obs std: 4.4683 Error distribution: Min: -49.8687 5th pct: -1.5618 25th pct: -0.4661 Median: +0.1029 75th pct: +1.0920 95th pct: +2.5073 Max: +20.4119 Statistics by depth: Depth N Bias RMSE Corr ------------------------------------------------------ 0-10m 97,586 +0.5489 1.0941 0.9736 10-25m 146,026 +0.4731 1.1356 0.9656 25-50m 232,410 +0.7929 1.5585 0.9185 50-100m 425,244 +1.0412 1.7604 0.9027 100-200m 495,283 +0.6132 1.6180 0.9098 200-500m 1,075,630 +0.2251 1.3910 0.9357 500-1000m 1,117,875 -0.2990 1.0145 0.9695 📄 Download Statistics Report (txt) · 📄 YAML\nPlots Amm7 Argo Argo Overview\nAMM7_ARGO — Hovmöller diagram\nPractical Salinity — statistics vs depth profile\nTemperature — statistics vs depth profile\nObservations ARGO Observations — 2016-2023 ARGO Station Map\nARGO Observation Density\nARGO Hovmoller\nICES Observations — 2016-2022 ICES Station Map\nICES Observation Density\nICES Alk Hovmoller\nICES Amon Hovmoller\nICES Doxy Hovmoller\nICES Ntra Hovmoller\nICES Ph Hovmoller\nICES Phos Hovmoller\nICES PSAL Hovmoller\nICES Slca Hovmoller\nICES TEMP Hovmoller\nICES Observations — 2016-2023 ICES Station Map\nICES Observation Density\nICES Alk Hovmoller\nICES Amon Hovmoller\nICES Cphl Hovmoller\nICES Doxy Hovmoller\nICES Ntra Hovmoller\nICES Ph Hovmoller\nICES Phos Hovmoller\nICES PSAL Hovmoller\nICES Slca Hovmoller\nICES TEMP Hovmoller\nMethodology Horizontal Validation Model surface fields compared against gridded satellite products and in-situ observations.\nStatistics: RMSE, Bias, MAE, Pearson correlation.\nSpatial statistics show the error distribution across the domain.\nGridded 3D Validation Model vertical profiles compared against gridded 3D climatologies.\nStatistics: RMSE and Bias at each depth level.\nICES Point Profiles Quality-controlled hydrographic profiles from the ICES data portal (temperature, salinity, biogeochemical variables).\nArgo Float Profiles Autonomous profiling floats providing temperature and salinity profiles to 2000 m depth (Ifremer ERDDAP).\n← Back to AMM7 View All Validations →\n","permalink":"https://bolding-bruggeman.com/oceanicu_3d/validations/amm7-obskd/","summary":"\u003cp\u003eHorizontal Validation results comparing model output against observations.\u003c/p\u003e\n\u003ch2 id=\"experiment-information\"\u003eExperiment Information\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eArea\u003c/strong\u003e: AMM7\n\u003cstrong\u003eExperiment\u003c/strong\u003e: ObsKd\n\u003cstrong\u003eValidation Type\u003c/strong\u003e: Horizontal Validation\n\u003cstrong\u003eVariables\u003c/strong\u003e: SALT_SURFACE, TEMP_SURFACE\u003c/p\u003e\n\u003ch2 id=\"overview\"\u003eOverview\u003c/h2\u003e\n\u003ctable\u003e\n  \u003cthead\u003e\n      \u003ctr\u003e\n          \u003cth\u003eMetric\u003c/th\u003e\n          \u003cth\u003eSALT_SURFACE / CCI-SSS\u003c/th\u003e\n          \u003cth\u003eTEMP_SURFACE / OSTIA\u003c/th\u003e\n          \u003cth\u003eTEMP_SURFACE / CCI-SST\u003c/th\u003e\n      \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eRMSE\u003c/td\u003e\n          \u003ctd\u003e1.0175\u003c/td\u003e\n          \u003ctd\u003e0.9880\u003c/td\u003e\n          \u003ctd\u003e0.9801\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eBias\u003c/td\u003e\n          \u003ctd\u003e0.3028\u003c/td\u003e\n          \u003ctd\u003e0.5735\u003c/td\u003e\n          \u003ctd\u003e0.5491\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eCorr\u003c/td\u003e\n          \u003ctd\u003e0.5923\u003c/td\u003e\n          \u003ctd\u003e0.9654\u003c/td\u003e\n          \u003ctd\u003e0.9639\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eN points\u003c/td\u003e\n          \u003ctd\u003e195,106,513\u003c/td\u003e\n          \u003ctd\u003e151,821,276\u003c/td\u003e\n          \u003ctd\u003e197,655,640\u003c/td\u003e\n      \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch3 id=\"annual-statistics-trends\"\u003eAnnual Statistics Trends\u003c/h3\u003e\n\u003cp\u003e\u003cimg alt=\"Salinity (surface) — annual statistics timeseries (RMSE, bias, correlation)\" loading=\"lazy\" src=\"/validation-data/amm7-obskd/physics/pyGETM/2016-2023/surface/salt_surface_timeseries_statistics.png\"\u003e\n\u003cem\u003eSalinity (surface) — annual statistics timeseries (RMSE, bias, correlation)\u003c/em\u003e\u003c/p\u003e","title":"AMM7 - Experiment ObsKd"},{"content":"Harmonic analysis of sea surface elevation compared with satellite products and tide gauge observations.\nAnalysis Summary Analyzed Constituents: K1, K2, M2, N2, O1, P1, Q1, S2\nAnalysis Date: 2026-10-10 Satellite Product: FES2014/TPXO9\nPlots Tide Gauge Station Map GESLA tide gauge station locations\nK₁ (lunar-solar diurnal) — amplitude/phase comparison with GESLA tide gauges\nO₁ (principal lunar diurnal) — amplitude/phase comparison with GESLA tide gauges\nP₁ (principal solar diurnal) — amplitude/phase comparison with GESLA tide gauges\nQ₁ (larger lunar elliptic diurnal) — amplitude/phase comparison with GESLA tide gauges\nK₂ (lunar-solar semi-diurnal) — amplitude/phase comparison with GESLA tide gauges\nM₂ (principal lunar semi-diurnal) — amplitude/phase comparison with GESLA tide gauges\nN₂ (larger lunar elliptic semi-diurnal) — amplitude/phase comparison with GESLA tide gauges\nS₂ (principal solar semi-diurnal) — amplitude/phase comparison with GESLA tide gauges\nStation amplitude/phase comparison — diurnal constituents\nStation amplitude/phase comparison — semi-diurnal constituents\nTide Gauge Station Comparison Compared with 110 tide gauge stations.\nStation Results (Sample) station lat lon country years_of_obs constituent model_amp obs_amp amp_diff model_pha obs_pha pha_diff vianadocastelotg-via-prt-cmems 41.685 -8.840 PRT 14.000 M2 1.056 1.028 0.029 76.832 76.090 0.742 vianadocastelotg-via-prt-cmems 41.685 -8.840 PRT 14.000 S2 0.378 0.357 0.021 106.093 105.580 0.513 vianadocastelotg-via-prt-cmems 41.685 -8.840 PRT 14.000 N2 0.221 0.226 -0.004 58.698 58.157 0.540 vianadocastelotg-via-prt-cmems 41.685 -8.840 PRT 14.000 K2 0.105 0.097 0.008 102.739 101.403 1.335 vianadocastelotg-via-prt-cmems 41.685 -8.840 PRT 14.000 K1 0.085 0.068 0.018 72.355 61.893 10.462 vianadocastelotg-via-prt-cmems 41.685 -8.840 PRT 14.000 O1 0.052 0.063 -0.011 -35.780 -39.879 4.099 vianadocastelotg-via-prt-cmems 41.685 -8.840 PRT 14.000 P1 0.025 0.021 0.005 69.020 51.716 17.304 vianadocastelotg-via-prt-cmems 41.685 -8.840 PRT 14.000 Q1 0.018 0.020 -0.003 -97.029 -91.660 -5.369 vigo-vigo-esp-ieo 42.238 -8.730 ESP 74.000 M2 1.091 1.079 0.012 78.838 77.453 1.386 vigo-vigo-esp-ieo 42.238 -8.730 ESP 74.000 S2 0.390 0.377 0.013 108.371 106.068 2.303 vigo-vigo-esp-ieo 42.238 -8.730 ESP 74.000 N2 0.228 0.230 -0.002 60.594 58.486 2.107 vigo-vigo-esp-ieo 42.238 -8.730 ESP 74.000 K2 0.109 0.105 0.004 105.119 103.747 1.372 vigo-vigo-esp-ieo 42.238 -8.730 ESP 74.000 K1 0.088 0.072 0.016 73.239 62.223 11.017 vigo-vigo-esp-ieo 42.238 -8.730 ESP 74.000 O1 0.053 0.064 -0.010 -34.742 -40.579 5.837 vigo-vigo-esp-ieo 42.238 -8.730 ESP 74.000 P1 0.027 0.024 0.002 69.181 53.512 15.669 vigo-vigo-esp-ieo 42.238 -8.730 ESP 74.000 Q1 0.018 0.019 -0.001 -96.746 -91.475 -5.270 la_coruna-830-esp-uhslc_fd 43.367 -8.400 ESP 82.000 M2 1.224 1.178 0.046 87.170 86.397 0.773 la_coruna-830-esp-uhslc_fd 43.367 -8.400 ESP 82.000 S2 0.435 0.413 0.022 117.813 116.587 1.226 la_coruna-830-esp-uhslc_fd 43.367 -8.400 ESP 82.000 N2 0.255 0.248 0.007 68.379 67.271 1.108 la_coruna-830-esp-uhslc_fd 43.367 -8.400 ESP 82.000 K2 0.122 0.116 0.006 114.740 113.760 0.981 Download Full Table\nMethodology Harmonic Analysis Tidal constituents extracted using UTide harmonic analysis package. Analysis performed on high-frequency model output (10-15 min resolution) over a minimum period of 60 days.\nSatellite Comparison Model results compared with satellite-derived tidal products:\nFES2014: Finite Element Solution 2014 (1/16° resolution) TPXO9: OSU Tidal Prediction Software (1/30° resolution) Satellite data regridded to model grid using conservative interpolation.\n← Back to AMM7\n","permalink":"https://bolding-bruggeman.com/oceanicu_3d/validations/amm7-tpxo9/","summary":"\u003cp\u003eHarmonic analysis of sea surface elevation compared with satellite products and tide gauge observations.\u003c/p\u003e\n\u003ch2 id=\"analysis-summary\"\u003eAnalysis Summary\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eAnalyzed Constituents\u003c/strong\u003e: K1, K2, M2, N2, O1, P1, Q1, S2\u003cbr\u003e\n\u003cstrong\u003eAnalysis Date\u003c/strong\u003e: 2026-10-10\n\u003cstrong\u003eSatellite Product\u003c/strong\u003e: FES2014/TPXO9\u003c/p\u003e\n\u003ch2 id=\"plots\"\u003ePlots\u003c/h2\u003e\n\u003ch3 id=\"tide-gauge-station-map\"\u003eTide Gauge Station Map\u003c/h3\u003e\n\u003cp\u003e\u003cimg alt=\"GESLA tide gauge station locations\" loading=\"lazy\" src=\"/validation-data/amm7-tpxo9/physics/pyGETM/2019-2022/tidal/gesla_station_map.png\"\u003e\n\u003cem\u003eGESLA tide gauge station locations\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg alt=\"K₁ (lunar-solar diurnal) — amplitude/phase comparison with GESLA tide gauges\" loading=\"lazy\" src=\"/validation-data/amm7-tpxo9/physics/pyGETM/2019-2022/tidal/K1_gesla_comparison.png\"\u003e\n\u003cem\u003eK₁ (lunar-solar diurnal) — amplitude/phase comparison with GESLA tide gauges\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg alt=\"O₁ (principal lunar diurnal) — amplitude/phase comparison with GESLA tide gauges\" loading=\"lazy\" src=\"/validation-data/amm7-tpxo9/physics/pyGETM/2019-2022/tidal/O1_gesla_comparison.png\"\u003e\n\u003cem\u003eO₁ (principal lunar diurnal) — amplitude/phase comparison with GESLA tide gauges\u003c/em\u003e\u003c/p\u003e","title":"AMM7 - TPXO9 - Tidal Analysis"},{"content":"AMM7 Experiment Rankings Composite-score ranking of every experiment validated for AMM7, one chart per validation category. See the AMM7 overview for the full per-experiment statistics these are built from. See All Areas to compare across areas.\nTidal Analysis Only one experiment validated so far for this category — ranking needs at least two.\nHorizontal Surface Validation Gridded 3D Validation Argo Profile Validation ICES Point Observation Profiles MLE Cross-Experiment Ranking Only one experiment validated so far for this category — ranking needs at least two.\n","permalink":"https://bolding-bruggeman.com/oceanicu_3d/rankings/amm7/","summary":"\u003ch1 id=\"amm7-experiment-rankings\"\u003eAMM7 Experiment Rankings\u003c/h1\u003e\n\u003cp\u003eComposite-score ranking of every experiment validated for \u003cstrong\u003eAMM7\u003c/strong\u003e, one chart per validation category. See the \u003ca href=\"/validations/amm7-overview/\"\u003eAMM7 overview\u003c/a\u003e for the full per-experiment statistics these are built from. See \u003ca href=\"/rankings/all/\"\u003eAll Areas\u003c/a\u003e to compare across areas.\u003c/p\u003e\n\u003ch2 id=\"tidal-analysis\"\u003eTidal Analysis\u003c/h2\u003e\n\u003cp\u003e\u003ca id=\"tides\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003cem\u003eOnly one experiment validated so far for this category — ranking needs at least two.\u003c/em\u003e\u003c/p\u003e\n\u003ch2 id=\"horizontal-surface-validation\"\u003eHorizontal Surface Validation\u003c/h2\u003e\n\u003cp\u003e\u003ca id=\"horizon-surface\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg alt=\"Salt experiment ranking\" loading=\"lazy\" src=\"/validations/amm7-ranking-horizon_surface-salt_surface.png\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg alt=\"Temp experiment ranking\" loading=\"lazy\" src=\"/validations/amm7-ranking-horizon_surface-temp_surface.png\"\u003e\u003c/p\u003e\n\u003ch2 id=\"gridded-3d-validation\"\u003eGridded 3D Validation\u003c/h2\u003e\n\u003cp\u003e\u003ca id=\"gridded-3d\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg alt=\"Salt experiment ranking\" loading=\"lazy\" src=\"/validations/amm7-ranking-gridded_3d-salt_3d.png\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg alt=\"Temp experiment ranking\" loading=\"lazy\" src=\"/validations/amm7-ranking-gridded_3d-temp_3d.png\"\u003e\u003c/p\u003e","title":"AMM7 Rankings"},{"content":"MLE Cross-Experiment Comparison — AMM7 SVD-reduced maximum-likelihood ranking of model experiments against a common observation footprint.\nRanking experiment log_likelihood rank delta_log_L aic explained_variance_captured Baseline -0.49748439587068466 1 0.0 2.9949687917413694 0.9972383853443495 NetSW_LW -0.5007573186360548 2 -0.003272922765370112 3.0015146372721095 0.9972383853443495 ObsKd -0.5017582854932605 3 -0.004273889622575855 3.003516570986521 0.9972383853443495 Diagnostic Plots ","permalink":"https://bolding-bruggeman.com/oceanicu_3d/validations/amm7-mle-comparison/","summary":"\u003ch1 id=\"mle-cross-experiment-comparison--amm7\"\u003eMLE Cross-Experiment Comparison — AMM7\u003c/h1\u003e\n\u003cp\u003eSVD-reduced maximum-likelihood ranking of model experiments against a common observation footprint.\u003c/p\u003e\n\u003ch2 id=\"ranking\"\u003eRanking\u003c/h2\u003e\n\u003ctable\u003e\n  \u003cthead\u003e\n      \u003ctr\u003e\n          \u003cth\u003eexperiment\u003c/th\u003e\n          \u003cth\u003elog_likelihood\u003c/th\u003e\n          \u003cth\u003erank\u003c/th\u003e\n          \u003cth\u003edelta_log_L\u003c/th\u003e\n          \u003cth\u003eaic\u003c/th\u003e\n          \u003cth\u003eexplained_variance_captured\u003c/th\u003e\n      \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eBaseline\u003c/td\u003e\n          \u003ctd\u003e-0.49748439587068466\u003c/td\u003e\n          \u003ctd\u003e1\u003c/td\u003e\n          \u003ctd\u003e0.0\u003c/td\u003e\n          \u003ctd\u003e2.9949687917413694\u003c/td\u003e\n          \u003ctd\u003e0.9972383853443495\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eNetSW_LW\u003c/td\u003e\n          \u003ctd\u003e-0.5007573186360548\u003c/td\u003e\n          \u003ctd\u003e2\u003c/td\u003e\n          \u003ctd\u003e-0.003272922765370112\u003c/td\u003e\n          \u003ctd\u003e3.0015146372721095\u003c/td\u003e\n          \u003ctd\u003e0.9972383853443495\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eObsKd\u003c/td\u003e\n          \u003ctd\u003e-0.5017582854932605\u003c/td\u003e\n          \u003ctd\u003e3\u003c/td\u003e\n          \u003ctd\u003e-0.004273889622575855\u003c/td\u003e\n          \u003ctd\u003e3.003516570986521\u003c/td\u003e\n          \u003ctd\u003e0.9972383853443495\u003c/td\u003e\n      \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch2 id=\"diagnostic-plots\"\u003eDiagnostic Plots\u003c/h2\u003e\n\u003cp\u003e\u003cimg alt=\"1_scree_plot\" loading=\"lazy\" src=\"/validations/amm7-mle-comparison/1_scree_plot.png\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg alt=\"2_mode_loadings_mode0\" loading=\"lazy\" src=\"/validations/amm7-mle-comparison/2_mode_loadings_mode0.png\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg alt=\"3_per_mode_contributions\" loading=\"lazy\" src=\"/validations/amm7-mle-comparison/3_per_mode_contributions.png\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg alt=\"4_contributions_by_obs_type\" loading=\"lazy\" src=\"/validations/amm7-mle-comparison/4_contributions_by_obs_type.png\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg alt=\"4_contributions_by_variable\" loading=\"lazy\" src=\"/validations/amm7-mle-comparison/4_contributions_by_variable.png\"\u003e\u003c/p\u003e","title":"MLE Comparison — AMM7"},{"content":"MLE Cross-Experiment Comparison — NS SVD-reduced maximum-likelihood ranking of model experiments against a common observation footprint.\nRanking experiment log_likelihood rank delta_log_L aic explained_variance_captured ObsKd -0.8997876421014234 1 0.0 3.799575284202847 0.9923041270768755 Adaptive_1 -1.0049792344553714 2 -0.10519159235394804 4.009958468910742 0.9923041270768755 Adaptive_3 -1.0061267306983028 3 -0.10633908859687946 4.012253461396606 0.9923041270768755 Adaptive_2 -1.0103562758376738 4 -0.11056863373625048 4.020712551675348 0.9923041270768755 SSRD_STRD -1.0108718935484369 5 -0.1110842514470135 4.021743787096874 0.9923041270768755 Baseline -1.011708243472961 6 -0.11192060137153759 4.023416486945922 0.9923041270768755 SSR_STR -1.0188474815428445 7 -0.11905983944142118 4.0376949630856895 0.9923041270768755 CMEMS -1.0373224983429865 8 -0.13753485624156314 4.074644996685973 0.9923041270768755 Diagnostic Plots ","permalink":"https://bolding-bruggeman.com/oceanicu_3d/validations/ns-mle-comparison/","summary":"\u003ch1 id=\"mle-cross-experiment-comparison--ns\"\u003eMLE Cross-Experiment Comparison — NS\u003c/h1\u003e\n\u003cp\u003eSVD-reduced maximum-likelihood ranking of model experiments against a common observation footprint.\u003c/p\u003e\n\u003ch2 id=\"ranking\"\u003eRanking\u003c/h2\u003e\n\u003ctable\u003e\n  \u003cthead\u003e\n      \u003ctr\u003e\n          \u003cth\u003eexperiment\u003c/th\u003e\n          \u003cth\u003elog_likelihood\u003c/th\u003e\n          \u003cth\u003erank\u003c/th\u003e\n          \u003cth\u003edelta_log_L\u003c/th\u003e\n          \u003cth\u003eaic\u003c/th\u003e\n          \u003cth\u003eexplained_variance_captured\u003c/th\u003e\n      \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eObsKd\u003c/td\u003e\n          \u003ctd\u003e-0.8997876421014234\u003c/td\u003e\n          \u003ctd\u003e1\u003c/td\u003e\n          \u003ctd\u003e0.0\u003c/td\u003e\n          \u003ctd\u003e3.799575284202847\u003c/td\u003e\n          \u003ctd\u003e0.9923041270768755\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eAdaptive_1\u003c/td\u003e\n          \u003ctd\u003e-1.0049792344553714\u003c/td\u003e\n          \u003ctd\u003e2\u003c/td\u003e\n          \u003ctd\u003e-0.10519159235394804\u003c/td\u003e\n          \u003ctd\u003e4.009958468910742\u003c/td\u003e\n          \u003ctd\u003e0.9923041270768755\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eAdaptive_3\u003c/td\u003e\n          \u003ctd\u003e-1.0061267306983028\u003c/td\u003e\n          \u003ctd\u003e3\u003c/td\u003e\n          \u003ctd\u003e-0.10633908859687946\u003c/td\u003e\n          \u003ctd\u003e4.012253461396606\u003c/td\u003e\n          \u003ctd\u003e0.9923041270768755\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eAdaptive_2\u003c/td\u003e\n          \u003ctd\u003e-1.0103562758376738\u003c/td\u003e\n          \u003ctd\u003e4\u003c/td\u003e\n          \u003ctd\u003e-0.11056863373625048\u003c/td\u003e\n          \u003ctd\u003e4.020712551675348\u003c/td\u003e\n          \u003ctd\u003e0.9923041270768755\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eSSRD_STRD\u003c/td\u003e\n          \u003ctd\u003e-1.0108718935484369\u003c/td\u003e\n          \u003ctd\u003e5\u003c/td\u003e\n          \u003ctd\u003e-0.1110842514470135\u003c/td\u003e\n          \u003ctd\u003e4.021743787096874\u003c/td\u003e\n          \u003ctd\u003e0.9923041270768755\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eBaseline\u003c/td\u003e\n          \u003ctd\u003e-1.011708243472961\u003c/td\u003e\n          \u003ctd\u003e6\u003c/td\u003e\n          \u003ctd\u003e-0.11192060137153759\u003c/td\u003e\n          \u003ctd\u003e4.023416486945922\u003c/td\u003e\n          \u003ctd\u003e0.9923041270768755\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eSSR_STR\u003c/td\u003e\n          \u003ctd\u003e-1.0188474815428445\u003c/td\u003e\n          \u003ctd\u003e7\u003c/td\u003e\n          \u003ctd\u003e-0.11905983944142118\u003c/td\u003e\n          \u003ctd\u003e4.0376949630856895\u003c/td\u003e\n          \u003ctd\u003e0.9923041270768755\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eCMEMS\u003c/td\u003e\n          \u003ctd\u003e-1.0373224983429865\u003c/td\u003e\n          \u003ctd\u003e8\u003c/td\u003e\n          \u003ctd\u003e-0.13753485624156314\u003c/td\u003e\n          \u003ctd\u003e4.074644996685973\u003c/td\u003e\n          \u003ctd\u003e0.9923041270768755\u003c/td\u003e\n      \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch2 id=\"diagnostic-plots\"\u003eDiagnostic Plots\u003c/h2\u003e\n\u003cp\u003e\u003cimg alt=\"1_scree_plot\" loading=\"lazy\" src=\"/validations/ns-mle-comparison/1_scree_plot.png\"\u003e\u003c/p\u003e","title":"MLE Comparison — NS"},{"content":"Analysis Overview — all analysis types in one page\nExperiments Adaptive_1 — validation Adaptive_2 — validation Adaptive_3 — validation Baseline — validation CMEMS — validation ObsKd — validation SSRD_STRD — validation SSR_SRT — validation SSR_STR — validation mle_comparison — mle_comparison North Sea (NS) Domain Description The NS domain is a high-resolution configuration of the North Sea and adjacent shelf seas, spanning from the English Channel in the south to the Norwegian Trench in the north, and from the eastern Atlantic shelf break to the Danish and German Bight.\nGeographic Coverage Latitude: 48.5°N to 60.8°N Longitude: 5.1°W to 13.4°E Resolution: ~1/20° spherical grid (~5 km) Vertical: 40 generalised vertical coordinate (GVC) levels Key Features Strong tidal dynamics with M2 amplitudes up to 3 m in the Southern Bight Seasonal stratification in the central and northern North Sea Significant freshwater influence from Rhine, Elbe, Thames, and Scottish rivers Norwegian Trench provides the deepest bathymetry (~700 m) Open boundaries driven by AMM7 CMEMS reanalysis (historical) or CMIP6 delta-change (future projections) Observation Datasets Dataset Variables Period Type ICES hydrographic database Temperature, Salinity 1993– Cruise CTD / bottle ARGO floats (Ifremer/GDAC) Temperature, Salinity 2000– Autonomous profilers OSTIA / CMEMS SST Sea surface temperature 2003– Level 4 satellite analysis GESLA tide gauges Sea level — High-frequency coastal gauge records FES2014 / TPXO9 Tidal constituents — Barotropic tidal model North Sea Modeling Area Domain Description The North Sea domain covers the northwest European shelf seas, including the North Sea, English Channel, and adjacent waters.\nGeographic Coverage Latitude: 50°N to 62°N Longitude: 5°W to 13°E Resolution: 7km horizontal, 35 sigma levels Depth range: 0 to 700m Key Features Strong tidal dynamics with M2 amplitudes up to 3m Seasonal stratification in central and northern regions Significant freshwater influence from Rhine, Elbe, Thames Important for fisheries, shipping, and offshore wind energy Bathymetry Bathymetry showing the shallow southern North Sea (\u0026lt;50m) and deeper Norwegian Trench (\u0026gt;300m)\nScientific Focus Tidal dynamics and energy dissipation Seasonal stratification and mixing Freshwater plumes and coastal processes Storm surge prediction How Input Files Were Generated Future ocean boundary conditions use CMIP6 model output as the climate-change signal on top of the historical CMEMS AMM7 reference.\nBathymetry Bathymetry Regridded conservatively from GEBCO 2025 onto the NS ~1/20° spherical grid using bathymetry-regrid (ocean-prep), with Beckmann-Haidvogel smoothing (rx0 ≤ 0.2). Output: bathymetry_ns.nc with variables lon, lat, mask, H.\nNS bathymetry config\nbathymetry-regrid --config config/northsea_1d20deg_bathy_create.yaml Boundary Conditions CMEMS historical boundaries (T, S, SSH, currents) AMM7 NWS MY reanalysis providing hourly barotropic and daily baroclinic boundary conditions for the historical period. Processed with ocean-prep run_cmems_boundaries.\nNS CMEMS boundary config\nConfig not yet committed.\npython cli/run_cmems_boundaries.py --config config/ns_bdy_create.yaml Tidal boundaries (TPXO9 + CMIP6 mean SSH / barotropic transport) TPXO9-atlas (13 constituents) tidal prediction for zos, uo, vo combined with CMIP6 monthly mean sea-surface height and depth-integrated barotropic transport. Scenario-specific; see Scenario Summary table below.\nNS tidal boundary config\nConfig not yet committed.\nrun-tidal-boundaries --config config/ns_tidal_bdy.yaml 3-D delta-change boundaries (T, S and optionally currents) Future 3-D boundary conditions via the delta-change method: AMM7 historical CMEMS reference cycled over the output period, with a CMIP6 monthly change signal (future 20-yr climatology minus historical 1985–2014 climatology) added at each boundary point. Scenario-specific; see Scenario Summary table below.\nNS delta-change boundary config\nConfig not yet committed.\nrun-delta-boundaries --config config/ns_delta_bdy.yaml --scenario ssp370 Initial Conditions Initial conditions (temperature, salinity) Monthly snapshots (1st of each month) from CMEMS NWS AMM7 MY reanalysis. Flood-fill propagates valid values into any remaining NaN cells on the model grid.\nNS initial conditions config\nConfig not yet committed.\npython cli/download_init_conditions.py --config config/ns_init_create.yaml --source AMM7 --year 2015 ","permalink":"https://bolding-bruggeman.com/oceanicu_3d/areas/ns/","summary":"NS modeling area — validation results and experiment overview.","title":"NS"},{"content":"Horizontal Validation results comparing model output against observations.\nExperiment Information Area: NS Experiment: Adaptive_1 Validation Type: Horizontal Validation Variables:\nICES Point Profiles Statistics PSAL Metric ICES point observations RMSE 2.5983 Bias +0.5417 MAE 1.2525 Corr 0.9533 Model mean 32.7137 Obs mean 32.1720 View Full Statistics Report ################################################################################ PSAL Profile Validation Statistics ################################################################################ Format: 1.1 Created: 2026-05-04 11:32:32 Area: NS Experiment: Adaptive_1 ################################################################################ ================================================================================ Period: 2016-2023 | Model: pyGETM ================================================================================ Analysed: 2026-05-04 12:32:44 --- ICES point observations --- RMSE: 2.5983 Bias: +0.5417 MAE: 1.2525 Correlation: 0.9533 N points: 2,236,819 N profiles: 27,980 Model mean: 32.7137 Obs mean: 32.1720 Model std: 4.4837 Obs std: 6.4251 Error distribution: Min: -17.2622 5th pct: -1.1804 25th pct: -0.5350 Median: -0.1916 75th pct: +0.1352 95th pct: +7.2982 Max: +33.6566 Statistics by depth: Depth N Bias RMSE Corr ------------------------------------------------------ 0-10m 391,114 +3.2667 5.2914 0.9252 10-25m 411,753 +0.7607 2.7948 0.9533 25-50m 407,320 -0.2130 1.3397 0.9564 50-100m 463,310 -0.3512 0.5545 0.5926 100-200m 324,064 -0.2796 0.3866 0.5915 200-500m 224,455 -0.1640 0.2229 0.6268 500-1000m 14,803 -0.1505 0.1743 0.6283 📄 Download Statistics Report (txt) · 📄 YAML\nTEMP Metric ICES point observations RMSE 1.5157 Bias -0.3820 MAE 1.0601 Corr 0.9148 Model mean 8.9551 Obs mean 9.3371 View Full Statistics Report ################################################################################ TEMP Profile Validation Statistics ################################################################################ Format: 1.1 Created: 2026-05-04 11:31:13 Area: NS Experiment: Adaptive_1 ################################################################################ ================================================================================ Period: 2016-2023 | Model: pyGETM ================================================================================ Analysed: 2026-05-04 12:31:26 --- ICES point observations --- RMSE: 1.5157 Bias: -0.3820 MAE: 1.0601 Correlation: 0.9148 N points: 2,246,185 N profiles: 25,958 Model mean: 8.9551 Obs mean: 9.3371 Model std: 3.6048 Obs std: 3.4742 Error distribution: Min: -12.0799 5th pct: -2.8013 25th pct: -1.0371 Median: -0.3669 75th pct: +0.3448 95th pct: +1.7690 Max: +12.0793 Statistics by depth: Depth N Bias RMSE Corr ------------------------------------------------------ 0-10m 390,980 +0.2308 1.6030 0.9569 10-25m 413,973 -0.3756 1.9747 0.9009 25-50m 409,721 -1.0428 1.8894 0.8219 50-100m 465,709 -0.7384 1.2876 0.6846 100-200m 325,784 -0.2764 0.7724 0.4844 200-500m 225,215 +0.2449 0.6559 0.3443 500-1000m 14,803 +0.8873 1.0165 0.0654 📄 Download Statistics Report (txt) · 📄 YAML\nPlots Practical Salinity — statistics vs depth profile\nTemperature — statistics vs depth profile\nArgo Float Profiles Statistics PSAL Metric ARGO floats RMSE 0.6922 Bias -0.2491 MAE 0.4690 Corr 0.6870 Model mean 34.5796 Obs mean 34.8287 View Full Statistics Report ################################################################################ PSAL Profile Validation Statistics ################################################################################ Format: 1.1 Created: 2026-05-04 13:36:50 Area: NS Experiment: Adaptive_1 ################################################################################ ================================================================================ Period: 2016-2023 | Model: pyGETM ================================================================================ Analysed: 2026-05-04 21:06:23 --- ARGO floats --- RMSE: 0.6922 Bias: -0.2491 MAE: 0.4690 Correlation: 0.6870 N points: 9,276 N profiles: 38 Model mean: 34.5796 Obs mean: 34.8287 Model std: 0.4922 Obs std: 0.8760 Error distribution: Min: -1.3595 5th pct: -0.8487 25th pct: -0.5278 Median: -0.3427 75th pct: -0.1773 95th pct: +0.4624 Max: +6.7553 Statistics by depth: Depth N Bias RMSE Corr ------------------------------------------------------ 0-10m 190 +1.5273 2.3618 0.6261 10-25m 537 +0.6580 1.6159 0.4985 25-50m 861 -0.2640 0.7838 0.5699 50-100m 1,730 -0.5288 0.6292 0.5865 100-200m 2,809 -0.3913 0.4478 0.6586 200-500m 2,938 -0.2318 0.2616 -0.4022 500-1000m 211 -0.1519 0.1538 0.7133 📄 Download Statistics Report (txt) · 📄 YAML\nTEMP Metric ARGO floats RMSE 1.0520 Bias -0.2508 MAE 0.6516 Corr 0.9069 Model mean 8.4063 Obs mean 8.6571 View Full Statistics Report ################################################################################ TEMP Profile Validation Statistics ################################################################################ Format: 1.1 Created: 2026-05-04 13:36:47 Area: NS Experiment: Adaptive_1 ################################################################################ ================================================================================ Period: 2016-2023 | Model: pyGETM ================================================================================ Analysed: 2026-05-04 21:06:21 --- ARGO floats --- RMSE: 1.0520 Bias: -0.2508 MAE: 0.6516 Correlation: 0.9069 N points: 9,276 N profiles: 38 Model mean: 8.4063 Obs mean: 8.6571 Model std: 1.3902 Obs std: 2.0979 Error distribution: Min: -5.5382 5th pct: -2.5747 25th pct: -0.5264 Median: +0.0516 75th pct: +0.2812 95th pct: +0.9205 Max: +2.9772 Statistics by depth: Depth N Bias RMSE Corr ------------------------------------------------------ 0-10m 190 -0.9902 1.4202 0.9279 10-25m 537 -1.2007 1.7462 0.8652 25-50m 861 -1.4986 2.1879 0.8437 50-100m 1,730 -0.5704 1.2907 0.7462 100-200m 2,809 -0.0489 0.4083 0.7435 200-500m 2,938 +0.2326 0.4143 0.2002 500-1000m 211 +1.1245 1.1272 -0.2890 📄 Download Statistics Report (txt) · 📄 YAML\nPlots Argo float profile overview (NE Atlantic)\nNA_ARGO — Hovmöller diagram\nNa Argo Overview\nPractical Salinity — statistics vs depth profile\nTemperature — statistics vs depth profile\nObservations ARGO Observations — 2016-2023 ARGO Station Map\nARGO Observation Density\nARGO Hovmoller\nICES Observations — 2016-2023 ICES Station Map\nICES Observation Density\nICES PSAL Hovmoller\nICES TEMP Hovmoller\nMethodology ICES Point Profiles Quality-controlled hydrographic profiles from the ICES data portal (temperature, salinity, biogeochemical variables).\nArgo Float Profiles Autonomous profiling floats providing temperature and salinity profiles to 2000 m depth (Ifremer ERDDAP).\n← Back to NS View All Validations →\n","permalink":"https://bolding-bruggeman.com/oceanicu_3d/validations/ns-adaptive-1/","summary":"\u003cp\u003eHorizontal Validation results comparing model output against observations.\u003c/p\u003e\n\u003ch2 id=\"experiment-information\"\u003eExperiment Information\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eArea\u003c/strong\u003e: NS\n\u003cstrong\u003eExperiment\u003c/strong\u003e: Adaptive_1\n\u003cstrong\u003eValidation Type\u003c/strong\u003e: Horizontal Validation\n\u003cstrong\u003eVariables\u003c/strong\u003e:\u003c/p\u003e\n\u003ch2 id=\"ices-point-profiles\"\u003eICES Point Profiles\u003c/h2\u003e\n\u003ch3 id=\"statistics\"\u003eStatistics\u003c/h3\u003e\n\u003ch3 id=\"psal\"\u003ePSAL\u003c/h3\u003e\n\u003ctable\u003e\n  \u003cthead\u003e\n      \u003ctr\u003e\n          \u003cth\u003eMetric\u003c/th\u003e\n          \u003cth\u003eICES point observations\u003c/th\u003e\n      \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eRMSE\u003c/td\u003e\n          \u003ctd\u003e2.5983\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eBias\u003c/td\u003e\n          \u003ctd\u003e+0.5417\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eMAE\u003c/td\u003e\n          \u003ctd\u003e1.2525\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eCorr\u003c/td\u003e\n          \u003ctd\u003e0.9533\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eModel mean\u003c/td\u003e\n          \u003ctd\u003e32.7137\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eObs mean\u003c/td\u003e\n          \u003ctd\u003e32.1720\u003c/td\u003e\n      \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\u003cdetails\u003e\n\u003csummary\u003eView Full Statistics Report\u003c/summary\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e################################################################################\nPSAL Profile Validation Statistics\n################################################################################\n  Format:     1.1\n  Created:    2026-05-04 11:32:32\n  Area:         NS\n  Experiment:   Adaptive_1\n################################################################################\n\n================================================================================\nPeriod: 2016-2023  |  Model: pyGETM\n================================================================================\nAnalysed: 2026-05-04  12:32:44\n\n--- ICES point observations ---\n  RMSE:          2.5983\n  Bias:         +0.5417\n  MAE:           1.2525\n  Correlation:   0.9533\n  N points:      2,236,819\n  N profiles:    27,980\n  Model mean:   32.7137\n  Obs mean:     32.1720\n  Model std:    4.4837\n  Obs std:      6.4251\n\n  Error distribution:\n    Min:         -17.2622\n    5th pct:      -1.1804\n    25th pct:     -0.5350\n    Median:       -0.1916\n    75th pct:     +0.1352\n    95th pct:     +7.2982\n    Max:         +33.6566\n\n  Statistics by depth:\n  Depth               N        Bias        RMSE      Corr\n  ------------------------------------------------------\n  0-10m         391,114     +3.2667      5.2914    0.9252\n  10-25m        411,753     +0.7607      2.7948    0.9533\n  25-50m        407,320     -0.2130      1.3397    0.9564\n  50-100m       463,310     -0.3512      0.5545    0.5926\n  100-200m      324,064     -0.2796      0.3866    0.5915\n  200-500m      224,455     -0.1640      0.2229    0.6268\n  500-1000m      14,803     -0.1505      0.1743    0.6283\n\u003c/code\u003e\u003c/pre\u003e\u003c/details\u003e\n\u003cp\u003e\u003ca href=\"/validation-data/ns-adaptive-1/psal_ices_validation_statistics.txt\"\u003e📄 Download Statistics Report (txt)\u003c/a\u003e · \u003ca href=\"/validation-data/ns-adaptive-1/psal_ices_validation_statistics.yaml\"\u003e📄 YAML\u003c/a\u003e\u003c/p\u003e","title":"NS - Experiment Adaptive_1"},{"content":"Horizontal Validation results comparing model output against observations.\nExperiment Information Area: NS Experiment: Adaptive_2 Validation Type: Horizontal Validation Variables:\nICES Point Profiles Statistics PSAL Metric ICES point observations RMSE 2.6006 Bias +0.5477 MAE 1.2463 Corr 0.9533 Model mean 32.7196 Obs mean 32.1719 View Full Statistics Report ################################################################################ PSAL Profile Validation Statistics ################################################################################ Format: 1.1 Created: 2026-05-04 11:35:41 Area: NS Experiment: Adaptive_2 ################################################################################ ================================================================================ Period: 2016-2023 | Model: pyGETM ================================================================================ Analysed: 2026-05-04 12:35:46 --- ICES point observations --- RMSE: 2.6006 Bias: +0.5477 MAE: 1.2463 Correlation: 0.9533 N points: 2,236,727 N profiles: 27,980 Model mean: 32.7196 Obs mean: 32.1719 Model std: 4.4828 Obs std: 6.4252 Error distribution: Min: -17.2593 5th pct: -1.2089 25th pct: -0.5187 Median: -0.1690 75th pct: +0.1343 95th pct: +7.3084 Max: +33.6466 Statistics by depth: Depth N Bias RMSE Corr ------------------------------------------------------ 0-10m 391,112 +3.2676 5.2989 0.9250 10-25m 411,753 +0.7546 2.7957 0.9535 25-50m 407,304 -0.2225 1.3425 0.9563 50-100m 463,301 -0.3469 0.5548 0.5939 100-200m 324,019 -0.2533 0.3624 0.5883 200-500m 224,437 -0.1277 0.1848 0.6149 500-1000m 14,801 -0.1068 0.1311 0.5827 📄 Download Statistics Report (txt) · 📄 YAML\nTEMP Metric ICES point observations RMSE 1.5284 Bias -0.3879 MAE 1.0692 Corr 0.9138 Model mean 8.9493 Obs mean 9.3372 View Full Statistics Report ################################################################################ TEMP Profile Validation Statistics ################################################################################ Format: 1.1 Created: 2026-05-04 11:34:22 Area: NS Experiment: Adaptive_2 ################################################################################ ================================================================================ Period: 2016-2023 | Model: pyGETM ================================================================================ Analysed: 2026-05-04 12:34:27 --- ICES point observations --- RMSE: 1.5284 Bias: -0.3879 MAE: 1.0692 Correlation: 0.9138 N points: 2,246,093 N profiles: 25,958 Model mean: 8.9493 Obs mean: 9.3372 Model std: 3.6161 Obs std: 3.4742 Error distribution: Min: -11.8202 5th pct: -2.8408 25th pct: -1.0480 Median: -0.3695 75th pct: +0.3525 95th pct: +1.7657 Max: +12.0630 Statistics by depth: Depth N Bias RMSE Corr ------------------------------------------------------ 0-10m 390,978 +0.2433 1.6008 0.9574 10-25m 413,973 -0.3783 1.9878 0.9004 25-50m 409,705 -1.0819 1.9186 0.8197 50-100m 465,700 -0.7511 1.3013 0.6788 100-200m 325,739 -0.2690 0.7751 0.4701 200-500m 225,197 +0.2556 0.6702 0.3072 500-1000m 14,801 +0.9022 1.0292 0.0510 📄 Download Statistics Report (txt) · 📄 YAML\nPlots Practical Salinity — statistics vs depth profile\nTemperature — statistics vs depth profile\nArgo Float Profiles Statistics PSAL Metric ARGO floats RMSE 0.6837 Bias -0.2363 MAE 0.4462 Corr 0.6854 Model mean 34.5924 Obs mean 34.8287 View Full Statistics Report ################################################################################ PSAL Profile Validation Statistics ################################################################################ Format: 1.1 Created: 2026-05-04 13:40:20 Area: NS Experiment: Adaptive_2 ################################################################################ ================================================================================ Period: 2016-2023 | Model: pyGETM ================================================================================ Analysed: 2026-05-04 21:09:54 --- ARGO floats --- RMSE: 0.6837 Bias: -0.2363 MAE: 0.4462 Correlation: 0.6854 N points: 9,276 N profiles: 38 Model mean: 34.5924 Obs mean: 34.8287 Model std: 0.5314 Obs std: 0.8760 Error distribution: Min: -1.3657 5th pct: -0.8918 25th pct: -0.5115 Median: -0.2966 75th pct: -0.1065 95th pct: +0.3630 Max: +6.7330 Statistics by depth: Depth N Bias RMSE Corr ------------------------------------------------------ 0-10m 190 +1.4830 2.3301 0.6245 10-25m 537 +0.5920 1.5942 0.4818 25-50m 861 -0.3423 0.8207 0.5565 50-100m 1,730 -0.5494 0.6531 0.5777 100-200m 2,809 -0.3626 0.4193 0.6424 200-500m 2,938 -0.1741 0.2078 -0.3555 500-1000m 211 -0.0785 0.0803 0.7182 📄 Download Statistics Report (txt) · 📄 YAML\nTEMP Metric ARGO floats RMSE 1.0642 Bias -0.2121 MAE 0.6645 Corr 0.8949 Model mean 8.4450 Obs mean 8.6571 View Full Statistics Report ################################################################################ TEMP Profile Validation Statistics ################################################################################ Format: 1.1 Created: 2026-05-04 13:40:18 Area: NS Experiment: Adaptive_2 ################################################################################ ================================================================================ Period: 2016-2023 | Model: pyGETM ================================================================================ Analysed: 2026-05-04 21:09:52 --- ARGO floats --- RMSE: 1.0642 Bias: -0.2121 MAE: 0.6645 Correlation: 0.8949 N points: 9,276 N profiles: 38 Model mean: 8.4450 Obs mean: 8.6571 Model std: 1.4181 Obs std: 2.0979 Error distribution: Min: -5.8034 5th pct: -2.4540 25th pct: -0.5205 Median: +0.0542 75th pct: +0.3214 95th pct: +1.0542 Max: +3.5171 Statistics by depth: Depth N Bias RMSE Corr ------------------------------------------------------ 0-10m 190 -0.9143 1.3495 0.9317 10-25m 537 -1.0309 1.7491 0.8264 25-50m 861 -1.2504 2.2038 0.7551 50-100m 1,730 -0.5697 1.3249 0.7442 100-200m 2,809 -0.0726 0.3876 0.8032 200-500m 2,938 +0.2642 0.4440 0.0286 500-1000m 211 +1.1835 1.1858 0.3587 📄 Download Statistics Report (txt) · 📄 YAML\nPlots Argo float profile overview (NE Atlantic)\nNA_ARGO — Hovmöller diagram\nNa Argo Overview\nPractical Salinity — statistics vs depth profile\nTemperature — statistics vs depth profile\nObservations ARGO Observations — 2016-2023 ARGO Station Map\nARGO Observation Density\nARGO Hovmoller\nICES Observations — 2016-2023 ICES Station Map\nICES Observation Density\nICES PSAL Hovmoller\nICES TEMP Hovmoller\nMethodology ICES Point Profiles Quality-controlled hydrographic profiles from the ICES data portal (temperature, salinity, biogeochemical variables).\nArgo Float Profiles Autonomous profiling floats providing temperature and salinity profiles to 2000 m depth (Ifremer ERDDAP).\n← Back to NS View All Validations →\n","permalink":"https://bolding-bruggeman.com/oceanicu_3d/validations/ns-adaptive-2/","summary":"\u003cp\u003eHorizontal Validation results comparing model output against observations.\u003c/p\u003e\n\u003ch2 id=\"experiment-information\"\u003eExperiment Information\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eArea\u003c/strong\u003e: NS\n\u003cstrong\u003eExperiment\u003c/strong\u003e: Adaptive_2\n\u003cstrong\u003eValidation Type\u003c/strong\u003e: Horizontal Validation\n\u003cstrong\u003eVariables\u003c/strong\u003e:\u003c/p\u003e\n\u003ch2 id=\"ices-point-profiles\"\u003eICES Point Profiles\u003c/h2\u003e\n\u003ch3 id=\"statistics\"\u003eStatistics\u003c/h3\u003e\n\u003ch3 id=\"psal\"\u003ePSAL\u003c/h3\u003e\n\u003ctable\u003e\n  \u003cthead\u003e\n      \u003ctr\u003e\n          \u003cth\u003eMetric\u003c/th\u003e\n          \u003cth\u003eICES point observations\u003c/th\u003e\n      \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eRMSE\u003c/td\u003e\n          \u003ctd\u003e2.6006\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eBias\u003c/td\u003e\n          \u003ctd\u003e+0.5477\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eMAE\u003c/td\u003e\n          \u003ctd\u003e1.2463\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eCorr\u003c/td\u003e\n          \u003ctd\u003e0.9533\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eModel mean\u003c/td\u003e\n          \u003ctd\u003e32.7196\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eObs mean\u003c/td\u003e\n          \u003ctd\u003e32.1719\u003c/td\u003e\n      \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\u003cdetails\u003e\n\u003csummary\u003eView Full Statistics Report\u003c/summary\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e################################################################################\nPSAL Profile Validation Statistics\n################################################################################\n  Format:     1.1\n  Created:    2026-05-04 11:35:41\n  Area:         NS\n  Experiment:   Adaptive_2\n################################################################################\n\n================================================================================\nPeriod: 2016-2023  |  Model: pyGETM\n================================================================================\nAnalysed: 2026-05-04  12:35:46\n\n--- ICES point observations ---\n  RMSE:          2.6006\n  Bias:         +0.5477\n  MAE:           1.2463\n  Correlation:   0.9533\n  N points:      2,236,727\n  N profiles:    27,980\n  Model mean:   32.7196\n  Obs mean:     32.1719\n  Model std:    4.4828\n  Obs std:      6.4252\n\n  Error distribution:\n    Min:         -17.2593\n    5th pct:      -1.2089\n    25th pct:     -0.5187\n    Median:       -0.1690\n    75th pct:     +0.1343\n    95th pct:     +7.3084\n    Max:         +33.6466\n\n  Statistics by depth:\n  Depth               N        Bias        RMSE      Corr\n  ------------------------------------------------------\n  0-10m         391,112     +3.2676      5.2989    0.9250\n  10-25m        411,753     +0.7546      2.7957    0.9535\n  25-50m        407,304     -0.2225      1.3425    0.9563\n  50-100m       463,301     -0.3469      0.5548    0.5939\n  100-200m      324,019     -0.2533      0.3624    0.5883\n  200-500m      224,437     -0.1277      0.1848    0.6149\n  500-1000m      14,801     -0.1068      0.1311    0.5827\n\u003c/code\u003e\u003c/pre\u003e\u003c/details\u003e\n\u003cp\u003e\u003ca href=\"/validation-data/ns-adaptive-2/psal_ices_validation_statistics.txt\"\u003e📄 Download Statistics Report (txt)\u003c/a\u003e · \u003ca href=\"/validation-data/ns-adaptive-2/psal_ices_validation_statistics.yaml\"\u003e📄 YAML\u003c/a\u003e\u003c/p\u003e","title":"NS - Experiment Adaptive_2"},{"content":"Horizontal Validation results comparing model output against observations.\nExperiment Information Area: NS Experiment: Adaptive_3 Validation Type: Horizontal Validation Variables:\nICES Point Profiles Statistics PSAL Metric ICES point observations RMSE 2.6013 Bias +0.5436 MAE 1.2563 Corr 0.9532 Model mean 32.7156 Obs mean 32.1720 View Full Statistics Report ################################################################################ PSAL Profile Validation Statistics ################################################################################ Format: 1.1 Created: 2026-05-04 11:38:51 Area: NS Experiment: Adaptive_3 ################################################################################ ================================================================================ Period: 2016-2023 | Model: pyGETM ================================================================================ Analysed: 2026-05-04 12:38:44 --- ICES point observations --- RMSE: 2.6013 Bias: +0.5436 MAE: 1.2563 Correlation: 0.9532 N points: 2,236,795 N profiles: 27,980 Model mean: 32.7156 Obs mean: 32.1720 Model std: 4.4810 Obs std: 6.4250 Error distribution: Min: -17.2535 5th pct: -1.1663 25th pct: -0.5393 Median: -0.1987 75th pct: +0.1378 95th pct: +7.3066 Max: +33.6562 Statistics by depth: Depth N Bias RMSE Corr ------------------------------------------------------ 0-10m 391,106 +3.2766 5.2981 0.9250 10-25m 411,736 +0.7713 2.7977 0.9532 25-50m 407,350 -0.2055 1.3373 0.9566 50-100m 463,309 -0.3517 0.5543 0.5911 100-200m 324,029 -0.2897 0.3961 0.5930 200-500m 224,457 -0.1794 0.2395 0.6292 500-1000m 14,808 -0.1664 0.1901 0.6165 📄 Download Statistics Report (txt) · 📄 YAML\nTEMP Metric ICES point observations RMSE 1.5151 Bias -0.3804 MAE 1.0595 Corr 0.9145 Model mean 8.9568 Obs mean 9.3372 View Full Statistics Report ################################################################################ TEMP Profile Validation Statistics ################################################################################ Format: 1.1 Created: 2026-05-04 11:37:30 Area: NS Experiment: Adaptive_3 ################################################################################ ================================================================================ Period: 2016-2023 | Model: pyGETM ================================================================================ Analysed: 2026-05-04 12:37:28 --- ICES point observations --- RMSE: 1.5151 Bias: -0.3804 MAE: 1.0595 Correlation: 0.9145 N points: 2,246,161 N profiles: 25,958 Model mean: 8.9568 Obs mean: 9.3372 Model std: 3.5958 Obs std: 3.4741 Error distribution: Min: -11.7916 5th pct: -2.8067 25th pct: -1.0357 Median: -0.3641 75th pct: +0.3438 95th pct: +1.7755 Max: +12.0768 Statistics by depth: Depth N Bias RMSE Corr ------------------------------------------------------ 0-10m 390,972 +0.2215 1.6071 0.9564 10-25m 413,956 -0.3785 1.9771 0.9001 25-50m 409,751 -1.0261 1.8853 0.8203 50-100m 465,708 -0.7334 1.2834 0.6857 100-200m 325,749 -0.2760 0.7729 0.4876 200-500m 225,217 +0.2416 0.6497 0.3641 500-1000m 14,808 +0.8863 1.0180 0.1003 📄 Download Statistics Report (txt) · 📄 YAML\nPlots Practical Salinity — statistics vs depth profile\nTemperature — statistics vs depth profile\nArgo Float Profiles Statistics PSAL Metric ARGO floats RMSE 0.7143 Bias -0.2648 MAE 0.4908 Corr 0.6610 Model mean 34.5639 Obs mean 34.8287 View Full Statistics Report ################################################################################ PSAL Profile Validation Statistics ################################################################################ Format: 1.1 Created: 2026-05-04 14:07:33 Area: NS Experiment: Adaptive_3 ################################################################################ ================================================================================ Period: 2016-2023 | Model: pyGETM ================================================================================ Analysed: 2026-05-04 21:13:25 --- ARGO floats --- RMSE: 0.7143 Bias: -0.2648 MAE: 0.4908 Correlation: 0.6610 N points: 9,276 N profiles: 38 Model mean: 34.5639 Obs mean: 34.8287 Model std: 0.4892 Obs std: 0.8760 Error distribution: Min: -1.3925 5th pct: -0.8811 25th pct: -0.5452 Median: -0.3641 75th pct: -0.1843 95th pct: +0.4947 Max: +6.7938 Statistics by depth: Depth N Bias RMSE Corr ------------------------------------------------------ 0-10m 190 +1.5637 2.3900 0.6247 10-25m 537 +0.6687 1.6501 0.4409 25-50m 861 -0.2892 0.8410 0.4793 50-100m 1,730 -0.5485 0.6493 0.5709 100-200m 2,809 -0.4119 0.4684 0.6501 200-500m 2,938 -0.2461 0.2769 -0.3835 500-1000m 211 -0.1639 0.1659 0.7071 📄 Download Statistics Report (txt) · 📄 YAML\nTEMP Metric ARGO floats RMSE 1.1031 Bias -0.1856 MAE 0.6964 Corr 0.8811 Model mean 8.4715 Obs mean 8.6571 View Full Statistics Report ################################################################################ TEMP Profile Validation Statistics ################################################################################ Format: 1.1 Created: 2026-05-04 14:07:31 Area: NS Experiment: Adaptive_3 ################################################################################ ================================================================================ Period: 2016-2023 | Model: pyGETM ================================================================================ Analysed: 2026-05-04 21:13:23 --- ARGO floats --- RMSE: 1.1031 Bias: -0.1856 MAE: 0.6964 Correlation: 0.8811 N points: 9,276 N profiles: 38 Model mean: 8.4715 Obs mean: 8.6571 Model std: 1.4037 Obs std: 2.0979 Error distribution: Min: -5.4893 5th pct: -2.6400 25th pct: -0.4859 Median: +0.1210 75th pct: +0.3083 95th pct: +1.0569 Max: +4.0149 Statistics by depth: Depth N Bias RMSE Corr ------------------------------------------------------ 0-10m 190 -1.0708 1.4978 0.9224 10-25m 537 -1.0319 1.9258 0.7623 25-50m 861 -1.2488 2.3253 0.6970 50-100m 1,730 -0.4750 1.3044 0.7046 100-200m 2,809 -0.0066 0.4185 0.7188 200-500m 2,938 +0.2431 0.4169 0.2390 500-1000m 211 +1.1224 1.1253 -0.6326 📄 Download Statistics Report (txt) · 📄 YAML\nPlots Argo float profile overview (NE Atlantic)\nNA_ARGO — Hovmöller diagram\nNa Argo Overview\nPractical Salinity — statistics vs depth profile\nTemperature — statistics vs depth profile\nObservations ARGO Observations — 2016-2023 ARGO Station Map\nARGO Observation Density\nARGO Hovmoller\nICES Observations — 2016-2023 ICES Station Map\nICES Observation Density\nICES PSAL Hovmoller\nICES TEMP Hovmoller\nMethodology ICES Point Profiles Quality-controlled hydrographic profiles from the ICES data portal (temperature, salinity, biogeochemical variables).\nArgo Float Profiles Autonomous profiling floats providing temperature and salinity profiles to 2000 m depth (Ifremer ERDDAP).\n← Back to NS View All Validations →\n","permalink":"https://bolding-bruggeman.com/oceanicu_3d/validations/ns-adaptive-3/","summary":"\u003cp\u003eHorizontal Validation results comparing model output against observations.\u003c/p\u003e\n\u003ch2 id=\"experiment-information\"\u003eExperiment Information\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eArea\u003c/strong\u003e: NS\n\u003cstrong\u003eExperiment\u003c/strong\u003e: Adaptive_3\n\u003cstrong\u003eValidation Type\u003c/strong\u003e: Horizontal Validation\n\u003cstrong\u003eVariables\u003c/strong\u003e:\u003c/p\u003e\n\u003ch2 id=\"ices-point-profiles\"\u003eICES Point Profiles\u003c/h2\u003e\n\u003ch3 id=\"statistics\"\u003eStatistics\u003c/h3\u003e\n\u003ch3 id=\"psal\"\u003ePSAL\u003c/h3\u003e\n\u003ctable\u003e\n  \u003cthead\u003e\n      \u003ctr\u003e\n          \u003cth\u003eMetric\u003c/th\u003e\n          \u003cth\u003eICES point observations\u003c/th\u003e\n      \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eRMSE\u003c/td\u003e\n          \u003ctd\u003e2.6013\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eBias\u003c/td\u003e\n          \u003ctd\u003e+0.5436\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eMAE\u003c/td\u003e\n          \u003ctd\u003e1.2563\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eCorr\u003c/td\u003e\n          \u003ctd\u003e0.9532\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eModel mean\u003c/td\u003e\n          \u003ctd\u003e32.7156\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eObs mean\u003c/td\u003e\n          \u003ctd\u003e32.1720\u003c/td\u003e\n      \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\u003cdetails\u003e\n\u003csummary\u003eView Full Statistics Report\u003c/summary\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e################################################################################\nPSAL Profile Validation Statistics\n################################################################################\n  Format:     1.1\n  Created:    2026-05-04 11:38:51\n  Area:         NS\n  Experiment:   Adaptive_3\n################################################################################\n\n================================================================================\nPeriod: 2016-2023  |  Model: pyGETM\n================================================================================\nAnalysed: 2026-05-04  12:38:44\n\n--- ICES point observations ---\n  RMSE:          2.6013\n  Bias:         +0.5436\n  MAE:           1.2563\n  Correlation:   0.9532\n  N points:      2,236,795\n  N profiles:    27,980\n  Model mean:   32.7156\n  Obs mean:     32.1720\n  Model std:    4.4810\n  Obs std:      6.4250\n\n  Error distribution:\n    Min:         -17.2535\n    5th pct:      -1.1663\n    25th pct:     -0.5393\n    Median:       -0.1987\n    75th pct:     +0.1378\n    95th pct:     +7.3066\n    Max:         +33.6562\n\n  Statistics by depth:\n  Depth               N        Bias        RMSE      Corr\n  ------------------------------------------------------\n  0-10m         391,106     +3.2766      5.2981    0.9250\n  10-25m        411,736     +0.7713      2.7977    0.9532\n  25-50m        407,350     -0.2055      1.3373    0.9566\n  50-100m       463,309     -0.3517      0.5543    0.5911\n  100-200m      324,029     -0.2897      0.3961    0.5930\n  200-500m      224,457     -0.1794      0.2395    0.6292\n  500-1000m      14,808     -0.1664      0.1901    0.6165\n\u003c/code\u003e\u003c/pre\u003e\u003c/details\u003e\n\u003cp\u003e\u003ca href=\"/validation-data/ns-adaptive-3/psal_ices_validation_statistics.txt\"\u003e📄 Download Statistics Report (txt)\u003c/a\u003e · \u003ca href=\"/validation-data/ns-adaptive-3/psal_ices_validation_statistics.yaml\"\u003e📄 YAML\u003c/a\u003e\u003c/p\u003e","title":"NS - Experiment Adaptive_3"},{"content":"Horizontal Validation results comparing model output against observations.\nExperiment Information Area: NS Experiment: Baseline Validation Type: Horizontal Validation Variables:\nICES Point Profiles Statistics PSAL Metric ICES point observations RMSE 2.6065 Bias +0.5403 MAE 1.2611 Corr 0.9532 Model mean 32.7075 Obs mean 32.1672 View Full Statistics Report ################################################################################ PSAL Profile Validation Statistics ################################################################################ Format: 1.1 Created: 2026-05-04 11:23:14 Area: NS Experiment: Baseline ################################################################################ ================================================================================ Period: 2016-2023 | Model: pyGETM ================================================================================ Analysed: 2026-05-04 12:23:48 --- ICES point observations --- RMSE: 2.6065 Bias: +0.5403 MAE: 1.2611 Correlation: 0.9532 N points: 2,239,481 N profiles: 27,982 Model mean: 32.7075 Obs mean: 32.1672 Model std: 4.4762 Obs std: 6.4284 Error distribution: Min: -17.2384 5th pct: -1.2003 25th pct: -0.5472 Median: -0.1946 75th pct: +0.1334 95th pct: +7.3167 Max: +33.6631 Statistics by depth: Depth N Bias RMSE Corr ------------------------------------------------------ 0-10m 391,140 +3.2820 5.3064 0.9254 10-25m 412,998 +0.7575 2.8053 0.9533 25-50m 407,979 -0.2234 1.3511 0.9556 50-100m 463,619 -0.3534 0.5594 0.5896 100-200m 324,278 -0.2827 0.3908 0.5918 200-500m 224,657 -0.1674 0.2268 0.6291 500-1000m 14,810 -0.1502 0.1737 0.6219 📄 Download Statistics Report (txt) · 📄 YAML\nTEMP Metric ICES point observations RMSE 1.5217 Bias -0.3850 MAE 1.0643 Corr 0.9137 Model mean 8.9525 Obs mean 9.3375 View Full Statistics Report ################################################################################ TEMP Profile Validation Statistics ################################################################################ Format: 1.1 Created: 2026-05-04 11:21:56 Area: NS Experiment: Baseline ################################################################################ ================================================================================ Period: 2016-2023 | Model: pyGETM ================================================================================ Analysed: 2026-05-04 12:22:31 --- ICES point observations --- RMSE: 1.5217 Bias: -0.3850 MAE: 1.0643 Correlation: 0.9137 N points: 2,248,854 N profiles: 25,958 Model mean: 8.9525 Obs mean: 9.3375 Model std: 3.5909 Obs std: 3.4748 Error distribution: Min: -11.9114 5th pct: -2.8304 25th pct: -1.0408 Median: -0.3687 75th pct: +0.3419 95th pct: +1.7761 Max: +12.0709 Statistics by depth: Depth N Bias RMSE Corr ------------------------------------------------------ 0-10m 391,007 +0.2189 1.6052 0.9565 10-25m 415,226 -0.3737 1.9666 0.9012 25-50m 410,379 -1.0592 1.9159 0.8165 50-100m 466,017 -0.7362 1.2933 0.6786 100-200m 325,997 -0.2709 0.7736 0.4806 200-500m 225,418 +0.2500 0.6567 0.3515 500-1000m 14,810 +0.9004 1.0302 0.0890 📄 Download Statistics Report (txt) · 📄 YAML\nPlots Practical Salinity — statistics vs depth profile\nTemperature — statistics vs depth profile\nArgo Float Profiles Statistics PSAL Metric ARGO floats RMSE 0.7073 Bias -0.2573 MAE 0.4818 Corr 0.6668 Model mean 34.5715 Obs mean 34.8287 View Full Statistics Report ################################################################################ PSAL Profile Validation Statistics ################################################################################ Format: 1.1 Created: 2026-05-04 13:29:52 Area: NS Experiment: Baseline ################################################################################ ================================================================================ Period: 2016-2023 | Model: pyGETM ================================================================================ Analysed: 2026-05-04 20:55:50 --- ARGO floats --- RMSE: 0.7073 Bias: -0.2573 MAE: 0.4818 Correlation: 0.6668 N points: 9,278 N profiles: 38 Model mean: 34.5715 Obs mean: 34.8287 Model std: 0.4939 Obs std: 0.8759 Error distribution: Min: -1.3696 5th pct: -0.8832 25th pct: -0.5361 Median: -0.3548 75th pct: -0.1680 95th pct: +0.4971 Max: +6.7696 Statistics by depth: Depth N Bias RMSE Corr ------------------------------------------------------ 0-10m 190 +1.5504 2.3777 0.6299 10-25m 537 +0.6633 1.6418 0.4536 25-50m 861 -0.2912 0.8347 0.4929 50-100m 1,730 -0.5446 0.6451 0.5791 100-200m 2,809 -0.4016 0.4579 0.6569 200-500m 2,940 -0.2331 0.2652 -0.3753 500-1000m 211 -0.1479 0.1500 0.7054 📄 Download Statistics Report (txt) · 📄 YAML\nTEMP Metric ARGO floats RMSE 1.0957 Bias -0.1966 MAE 0.6891 Corr 0.8850 Model mean 8.4603 Obs mean 8.6569 View Full Statistics Report ################################################################################ TEMP Profile Validation Statistics ################################################################################ Format: 1.1 Created: 2026-05-04 13:29:51 Area: NS Experiment: Baseline ################################################################################ ================================================================================ Period: 2016-2023 | Model: pyGETM ================================================================================ Analysed: 2026-05-04 20:55:47 --- ARGO floats --- RMSE: 1.0957 Bias: -0.1966 MAE: 0.6891 Correlation: 0.8850 N points: 9,278 N profiles: 38 Model mean: 8.4603 Obs mean: 8.6569 Model std: 1.4002 Obs std: 2.0977 Error distribution: Min: -5.4839 5th pct: -2.6555 25th pct: -0.4869 Median: +0.0987 75th pct: +0.3097 95th pct: +1.0350 Max: +3.9355 Statistics by depth: Depth N Bias RMSE Corr ------------------------------------------------------ 0-10m 190 -1.0744 1.4995 0.9228 10-25m 537 -1.0629 1.9149 0.7728 25-50m 861 -1.2799 2.3008 0.7228 50-100m 1,730 -0.4918 1.2974 0.7129 100-200m 2,809 -0.0205 0.4135 0.7279 200-500m 2,940 +0.2458 0.4206 0.2101 500-1000m 211 +1.1327 1.1354 -0.1278 📄 Download Statistics Report (txt) · 📄 YAML\nPlots Argo float profile overview (NE Atlantic)\nNA_ARGO — Hovmöller diagram\nNa Argo Overview\nPractical Salinity — statistics vs depth profile\nTemperature — statistics vs depth profile\nObservations ARGO Observations — 2016-2023 ARGO Station Map\nARGO Observation Density\nARGO Hovmoller\nICES Observations — 2016-2023 ICES Station Map\nICES Observation Density\nICES PSAL Hovmoller\nICES TEMP Hovmoller\nMethodology ICES Point Profiles Quality-controlled hydrographic profiles from the ICES data portal (temperature, salinity, biogeochemical variables).\nArgo Float Profiles Autonomous profiling floats providing temperature and salinity profiles to 2000 m depth (Ifremer ERDDAP).\n← Back to NS View All Validations →\n","permalink":"https://bolding-bruggeman.com/oceanicu_3d/validations/ns-baseline/","summary":"\u003cp\u003eHorizontal Validation results comparing model output against observations.\u003c/p\u003e\n\u003ch2 id=\"experiment-information\"\u003eExperiment Information\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eArea\u003c/strong\u003e: NS\n\u003cstrong\u003eExperiment\u003c/strong\u003e: Baseline\n\u003cstrong\u003eValidation Type\u003c/strong\u003e: Horizontal Validation\n\u003cstrong\u003eVariables\u003c/strong\u003e:\u003c/p\u003e\n\u003ch2 id=\"ices-point-profiles\"\u003eICES Point Profiles\u003c/h2\u003e\n\u003ch3 id=\"statistics\"\u003eStatistics\u003c/h3\u003e\n\u003ch3 id=\"psal\"\u003ePSAL\u003c/h3\u003e\n\u003ctable\u003e\n  \u003cthead\u003e\n      \u003ctr\u003e\n          \u003cth\u003eMetric\u003c/th\u003e\n          \u003cth\u003eICES point observations\u003c/th\u003e\n      \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eRMSE\u003c/td\u003e\n          \u003ctd\u003e2.6065\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eBias\u003c/td\u003e\n          \u003ctd\u003e+0.5403\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eMAE\u003c/td\u003e\n          \u003ctd\u003e1.2611\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eCorr\u003c/td\u003e\n          \u003ctd\u003e0.9532\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eModel mean\u003c/td\u003e\n          \u003ctd\u003e32.7075\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eObs mean\u003c/td\u003e\n          \u003ctd\u003e32.1672\u003c/td\u003e\n      \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\u003cdetails\u003e\n\u003csummary\u003eView Full Statistics Report\u003c/summary\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e################################################################################\nPSAL Profile Validation Statistics\n################################################################################\n  Format:     1.1\n  Created:    2026-05-04 11:23:14\n  Area:         NS\n  Experiment:   Baseline\n################################################################################\n\n================================================================================\nPeriod: 2016-2023  |  Model: pyGETM\n================================================================================\nAnalysed: 2026-05-04  12:23:48\n\n--- ICES point observations ---\n  RMSE:          2.6065\n  Bias:         +0.5403\n  MAE:           1.2611\n  Correlation:   0.9532\n  N points:      2,239,481\n  N profiles:    27,982\n  Model mean:   32.7075\n  Obs mean:     32.1672\n  Model std:    4.4762\n  Obs std:      6.4284\n\n  Error distribution:\n    Min:         -17.2384\n    5th pct:      -1.2003\n    25th pct:     -0.5472\n    Median:       -0.1946\n    75th pct:     +0.1334\n    95th pct:     +7.3167\n    Max:         +33.6631\n\n  Statistics by depth:\n  Depth               N        Bias        RMSE      Corr\n  ------------------------------------------------------\n  0-10m         391,140     +3.2820      5.3064    0.9254\n  10-25m        412,998     +0.7575      2.8053    0.9533\n  25-50m        407,979     -0.2234      1.3511    0.9556\n  50-100m       463,619     -0.3534      0.5594    0.5896\n  100-200m      324,278     -0.2827      0.3908    0.5918\n  200-500m      224,657     -0.1674      0.2268    0.6291\n  500-1000m      14,810     -0.1502      0.1737    0.6219\n\u003c/code\u003e\u003c/pre\u003e\u003c/details\u003e\n\u003cp\u003e\u003ca href=\"/validation-data/ns-baseline/psal_ices_validation_statistics.txt\"\u003e📄 Download Statistics Report (txt)\u003c/a\u003e · \u003ca href=\"/validation-data/ns-baseline/psal_ices_validation_statistics.yaml\"\u003e📄 YAML\u003c/a\u003e\u003c/p\u003e","title":"NS - Experiment Baseline"},{"content":"Horizontal Validation results comparing model output against observations.\nExperiment Information Area: NS Experiment: CMEMS Validation Type: Horizontal Validation Variables: SALT_BOTTOM, TEMP_BOTTOM, SALT_SURFACE, TEMP_SURFACE\nOverview Metric SALT_BOTTOM / NWS-salinity TEMP_BOTTOM / NWS-bottomT SALT_SURFACE / CCI-SSS TEMP_SURFACE / OSTIA TEMP_SURFACE / CCI-SST RMSE 0.4879 1.4122 2.2332 0.8598 0.8541 Bias 0.0749 -0.6136 -0.1010 0.1970 0.4024 Corr 0.8398 0.9208 0.9219 0.9010 0.9213 N points 58,068 58,068 16,531,480 2,003,850 17,213,415 Annual Statistics Trends Salinity (surface) — annual statistics timeseries (RMSE, bias, correlation)\nTemperature (surface) — annual statistics timeseries (RMSE, bias, correlation)\nHorizontal Validation Statistics SALT_BOTTOM Metric NWS-salinity RMSE 0.4879 Bias +0.0749 MAE 0.2796 Corr 0.8398 Model mean 34.7384 Obs mean 34.6636 View Full Statistics Report ################################################################################ SALT_BOTTOM Validation Statistics ################################################################################ Format: 1.1 Created: 2026-05-04 08:38:02 Author: KB Project: OceanICU Institute: BB Area: NS Experiment: CMEMS ################################################################################ ================================================================================ Period: 2016-2023 | Model: pyGETM ================================================================================ Analysed: 2026-05-04 09:24:44 --- NWS-salinity --- RMSE: 0.4879 Bias: +0.0749 MAE: 0.2796 Correlation: 0.8398 N points: 58,068 Model mean: 34.7384 Obs mean: 34.6636 Model std: 0.8816 Obs std: 0.7989 Error distribution: Min: -10.1723 5th pct: -0.6296 25th pct: -0.0285 Median: +0.1144 75th pct: +0.2671 95th pct: +0.5230 Max: +9.7811 ================================================================================ Period: 2016 | Model: pyGETM ================================================================================ Analysed: 2026-05-04 09:24:44 --- NWS-salinity --- RMSE: 0.4879 Bias: +0.0749 MAE: 0.2796 Correlation: 0.8398 N points: 58,068 Model mean: 34.7384 Obs mean: 34.6636 Model std: 0.8816 Obs std: 0.7989 Error distribution: Min: -10.1723 5th pct: -0.6296 25th pct: -0.0285 Median: +0.1144 75th pct: +0.2671 95th pct: +0.5230 Max: +9.7811 📄 Download Statistics Report (txt) · 📄 YAML\nTEMP_BOTTOM Metric NWS-bottomT RMSE 1.4122 Bias -0.6136 MAE 0.9115 Corr 0.9208 Model mean 8.6424 Obs mean 9.2560 View Full Statistics Report ################################################################################ TEMP_BOTTOM Validation Statistics ################################################################################ Format: 1.1 Created: 2026-05-04 08:37:40 Author: KB Project: OceanICU Institute: BB Area: NS Experiment: CMEMS ################################################################################ ================================================================================ Period: 2016-2023 | Model: pyGETM ================================================================================ Analysed: 2026-05-04 09:24:22 --- NWS-bottomT --- RMSE: 1.4122 Bias: -0.6136 MAE: 0.9115 Correlation: 0.9208 N points: 58,068 Model mean: 8.6424 Obs mean: 9.2560 Model std: 3.0763 Obs std: 3.2540 Error distribution: Min: -10.2789 5th pct: -3.1284 25th pct: -1.1299 Median: -0.2392 75th pct: +0.1677 95th pct: +0.7904 Max: +3.4116 ================================================================================ Period: 2016 | Model: pyGETM ================================================================================ Analysed: 2026-05-04 09:24:22 --- NWS-bottomT --- RMSE: 1.4122 Bias: -0.6136 MAE: 0.9115 Correlation: 0.9208 N points: 58,068 Model mean: 8.6424 Obs mean: 9.2560 Model std: 3.0763 Obs std: 3.2540 Error distribution: Min: -10.2789 5th pct: -3.1284 25th pct: -1.1299 Median: -0.2392 75th pct: +0.1677 95th pct: +0.7904 Max: +3.4116 📄 Download Statistics Report (txt) · 📄 YAML\nSALT_SURFACE Metric CCI-SSS RMSE 2.2332 Bias -0.1010 MAE 1.1942 Corr 0.9219 Model mean 32.8099 Obs mean 33.0738 View Full Statistics Report ################################################################################ SALT_SURFACE Validation Statistics ################################################################################ Format: 1.1 Created: 2026-05-04 09:23:50 Author: KB Project: OceanICU Institute: BB Area: NS Experiment: CMEMS ################################################################################ ================================================================================ Period: 2016-2023 | Model: pyGETM ================================================================================ Analysed: 2026-05-07 08:04:56 --- CCI-SSS --- RMSE: 2.2332 Bias: -0.1010 MAE: 1.1942 Correlation: 0.9219 N points: 16,531,480 Model mean: 32.8099 Obs mean: 33.0738 Model std: 5.2758 Obs std: 3.4437 Error distribution: Min: -29.0710 5th pct: -3.8999 25th pct: -0.2426 Median: +0.3087 75th pct: +0.8127 95th pct: +1.9089 Max: +14.4447 Monthly breakdown: Month RMSE Bias MAE Corr -------------------------------------------- Jan 2.1798 -0.2397 1.0593 0.9282 Feb 2.2350 -0.2855 1.0608 0.9246 Mar 2.3084 -0.1893 1.2082 0.9161 Apr 2.2102 -0.1710 1.2224 0.9223 May 2.1402 -0.1545 1.2026 0.9322 Jun 2.2213 -0.0484 1.2728 0.9200 Jul 2.1491 +0.0124 1.1709 0.9158 Aug 2.2884 +0.0322 1.2516 0.9107 Sep 2.3792 +0.0195 1.3232 0.9052 Oct 2.2765 +0.0627 1.2447 0.9086 Nov 2.3256 -0.0463 1.1993 0.9140 Dec 2.2576 -0.2154 1.1097 0.9236 -------------------------------------------- All 2.2332 -0.1010 1.1942 0.9219 ================================================================================ Period: 2016 | Model: pyGETM ================================================================================ Analysed: 2026-05-07 08:04:56 --- CCI-SSS --- RMSE: 1.9624 Bias: +0.2410 MAE: 1.1387 Correlation: 0.9311 N points: 2,077,414 Model mean: 33.1862 Obs mean: 33.0758 Model std: 4.9788 Obs std: 3.4872 Error distribution: Min: -28.1718 5th pct: -2.6694 25th pct: +0.0530 Median: +0.4876 75th pct: +1.0103 95th pct: +2.1139 Max: +14.4447 ================================================================================ Period: 2017 | Model: pyGETM ================================================================================ Analysed: 2026-05-07 08:04:56 --- CCI-SSS --- RMSE: 2.3162 Bias: -0.0157 MAE: 1.2143 Correlation: 0.9213 N points: 2,072,303 Model mean: 32.9092 Obs mean: 33.0686 Model std: 5.3606 Obs std: 3.4696 Error distribution: Min: -28.7901 5th pct: -4.1259 25th pct: -0.0723 Median: +0.3841 75th pct: +0.8888 95th pct: +2.0032 Max: +10.7868 ================================================================================ Period: 2018 | Model: pyGETM ================================================================================ Analysed: 2026-05-07 08:04:56 --- CCI-SSS --- RMSE: 2.4018 Bias: -0.3460 MAE: 1.1842 Correlation: 0.9236 N points: 2,056,640 Model mean: 32.7733 Obs mean: 33.2477 Model std: 5.4681 Obs std: 3.5455 Error distribution: Min: -28.7730 5th pct: -4.5800 25th pct: -0.4082 Median: +0.1207 75th pct: +0.5730 95th pct: +1.6785 Max: +11.3631 ================================================================================ Period: 2019 | Model: pyGETM ================================================================================ Analysed: 2026-05-07 08:04:56 --- CCI-SSS --- RMSE: 2.2862 Bias: -0.1992 MAE: 1.1727 Correlation: 0.9280 N points: 2,067,322 Model mean: 32.7883 Obs mean: 33.1263 Model std: 5.3341 Obs std: 3.4295 Error distribution: Min: -29.0710 5th pct: -4.0607 25th pct: -0.2776 Median: +0.2493 75th pct: +0.7198 95th pct: +1.7417 Max: +10.1715 ================================================================================ Period: 2020 | Model: pyGETM ================================================================================ Analysed: 2026-05-07 08:04:57 --- CCI-SSS --- RMSE: 2.2408 Bias: -0.0968 MAE: 1.1719 Correlation: 0.9241 N points: 2,065,576 Model mean: 32.7542 Obs mean: 33.0527 Model std: 5.3567 Obs std: 3.3748 Error distribution: Min: -25.6755 5th pct: -4.1724 25th pct: -0.1958 Median: +0.2821 75th pct: +0.8102 95th pct: +1.9192 Max: +9.7343 ================================================================================ Period: 2021 | Model: pyGETM ================================================================================ Analysed: 2026-05-07 08:04:57 --- CCI-SSS --- RMSE: 2.2624 Bias: -0.2819 MAE: 1.1847 Correlation: 0.9244 N points: 2,064,075 Model mean: 32.5380 Obs mean: 33.0125 Model std: 5.4038 Obs std: 3.4872 Error distribution: Min: -22.7722 5th pct: -4.3368 25th pct: -0.3992 Median: +0.2634 75th pct: +0.6940 95th pct: +1.5447 Max: +11.4668 ================================================================================ Period: 2022 | Model: pyGETM ================================================================================ Analysed: 2026-05-07 08:04:57 --- CCI-SSS --- RMSE: 2.3936 Bias: -0.2133 MAE: 1.3453 Correlation: 0.9175 N points: 2,064,075 Model mean: 32.6184 Obs mean: 33.0241 Model std: 5.4198 Obs std: 3.3329 Error distribution: Min: -27.6209 5th pct: -4.6468 25th pct: -0.3855 Median: +0.3520 75th pct: +0.8736 95th pct: +1.8849 Max: +8.5417 ================================================================================ Period: 2023 | Model: pyGETM ================================================================================ Analysed: 2026-05-07 08:04:57 --- CCI-SSS --- RMSE: 2.0031 Bias: +0.1006 MAE: 1.1422 Correlation: 0.9044 N points: 2,064,075 Model mean: 32.9091 Obs mean: 32.9830 Model std: 4.8238 Obs std: 3.4115 Error distribution: Min: -26.5762 5th pct: -2.8086 25th pct: -0.2291 Median: +0.3301 75th pct: +0.8974 95th pct: +2.2094 Max: +11.4691 📄 Download Statistics Report (txt) · 📄 YAML\nTEMP_SURFACE Metric OSTIA CCI-SST RMSE 0.8598 0.8541 Bias +0.1970 +0.4024 MAE 0.6761 0.6755 Corr 0.9010 0.9213 Model mean 11.1727 11.4266 Obs mean 10.9757 11.0242 View Full Statistics Report ################################################################################ TEMP_SURFACE Validation Statistics ################################################################################ Format: 1.1 Created: 2026-05-04 08:37:10 Author: KB Project: OceanICU Institute: BB Area: NS Experiment: CMEMS ################################################################################ ================================================================================ Period: 2016-2023 | Model: pyGETM ================================================================================ Analysed: 2026-05-07 07:54:54 --- OSTIA --- RMSE: 0.8598 Bias: +0.1970 MAE: 0.6761 Correlation: 0.9010 N points: 2,003,850 Model mean: 11.1727 Obs mean: 10.9757 Model std: 4.2401 Obs std: 3.9426 Error distribution: Min: -7.1744 5th pct: -0.9853 25th pct: -0.2768 Median: +0.1666 75th pct: +0.6310 95th pct: +1.4022 Max: +7.9395 Monthly breakdown: Month RMSE Bias MAE Corr -------------------------------------------- Jan 0.7229 -0.2550 0.5449 0.9400 Feb 0.6042 -0.0340 0.4493 0.9239 Mar 0.6149 -0.0170 0.4606 0.8878 Apr 0.5382 -0.0852 0.3939 0.8233 May 0.8404 +0.3031 0.6237 0.9041 Jun 1.7251 +1.2612 1.4524 0.8453 Jul 1.3257 +0.8365 1.1079 0.8695 Aug 0.9577 +0.4789 0.7655 0.9295 Sep 0.8016 +0.1034 0.6220 0.9606 Oct 0.7823 -0.1480 0.6267 0.9310 Nov 0.7145 -0.0471 0.5509 0.9065 Dec 0.6757 -0.0334 0.5113 0.8896 -------------------------------------------- All 0.8598 +0.1970 0.6761 0.9010 --- CCI-SST --- RMSE: 0.8541 Bias: +0.4024 MAE: 0.6755 Correlation: 0.9213 N points: 17,213,415 Model mean: 11.4266 Obs mean: 11.0242 Model std: 4.2066 Obs std: 3.9824 Error distribution: Min: -7.8403 5th pct: -0.7046 25th pct: -0.0363 Median: +0.3916 75th pct: +0.8270 95th pct: +1.5552 Max: +8.4914 Monthly breakdown: Month RMSE Bias MAE Corr -------------------------------------------- Jan 0.6262 +0.1690 0.4699 0.9359 Feb 0.6282 +0.1686 0.4586 0.9399 Mar 0.5890 +0.1997 0.4302 0.9425 Apr 0.5680 +0.2267 0.4290 0.9313 May 0.9602 +0.6022 0.7531 0.9152 Jun 1.4925 +1.0823 1.2532 0.8952 Jul 1.3847 +0.9859 1.1698 0.9011 Aug 1.0726 +0.6578 0.8646 0.9273 Sep 0.8148 +0.1911 0.6194 0.9500 Oct 0.7477 +0.0475 0.5751 0.9360 Nov 0.6801 +0.1772 0.5137 0.9259 Dec 0.7516 +0.3026 0.5539 0.9111 -------------------------------------------- All 0.8541 +0.4024 0.6755 0.9213 ================================================================================ Period: 2016 | Model: pyGETM ================================================================================ Analysed: 2026-05-07 07:54:54 --- OSTIA --- RMSE: 0.8598 Bias: +0.1970 MAE: 0.6761 Correlation: 0.9010 N points: 2,003,850 Model mean: 11.1727 Obs mean: 10.9757 Model std: 4.2401 Obs std: 3.9426 Error distribution: Min: -7.1744 5th pct: -0.9853 25th pct: -0.2768 Median: +0.1666 75th pct: +0.6310 95th pct: +1.4022 Max: +7.9395 --- CCI-SST --- RMSE: 0.8271 Bias: +0.2944 MAE: 0.6560 Correlation: 0.9258 N points: 2,156,106 Model mean: 11.3043 Obs mean: 11.0099 Model std: 4.2196 Obs std: 3.9205 Error distribution: Min: -6.8646 5th pct: -0.7895 25th pct: -0.1504 Median: +0.2648 75th pct: +0.7036 95th pct: +1.4293 Max: +7.5252 ================================================================================ Period: 2017 | Model: pyGETM ================================================================================ Analysed: 2026-05-07 07:54:54 --- CCI-SST --- RMSE: 0.8032 Bias: +0.3863 MAE: 0.6358 Correlation: 0.9264 N points: 2,150,199 Model mean: 11.3208 Obs mean: 10.9345 Model std: 4.0051 Obs std: 3.7916 Error distribution: Min: -6.4653 5th pct: -0.6456 25th pct: -0.0430 Median: +0.3705 75th pct: +0.7915 95th pct: +1.4407 Max: +7.2120 ================================================================================ Period: 2018 | Model: pyGETM ================================================================================ Analysed: 2026-05-07 07:54:54 --- CCI-SST --- RMSE: 0.9637 Bias: +0.4715 MAE: 0.7590 Correlation: 0.9241 N points: 2,150,213 Model mean: 11.2432 Obs mean: 10.7718 Model std: 4.7218 Obs std: 4.5159 Error distribution: Min: -7.8403 5th pct: -0.7636 25th pct: -0.0196 Median: +0.4534 75th pct: +0.9389 95th pct: +1.7693 Max: +7.1265 ================================================================================ Period: 2019 | Model: pyGETM ================================================================================ Analysed: 2026-05-07 07:54:54 --- CCI-SST --- RMSE: 0.8462 Bias: +0.4463 MAE: 0.6805 Correlation: 0.9271 N points: 2,150,215 Model mean: 11.3664 Obs mean: 10.9201 Model std: 4.0471 Obs std: 3.7613 Error distribution: Min: -5.5929 5th pct: -0.6113 25th pct: +0.0056 Median: +0.4199 75th pct: +0.8461 95th pct: +1.5285 Max: +7.5057 ================================================================================ Period: 2020 | Model: pyGETM ================================================================================ Analysed: 2026-05-07 07:54:55 --- CCI-SST --- RMSE: 0.7883 Bias: +0.3926 MAE: 0.6278 Correlation: 0.9227 N points: 2,156,106 Model mean: 11.4934 Obs mean: 11.1007 Model std: 3.8711 Obs std: 3.6252 Error distribution: Min: -7.8276 5th pct: -0.6280 25th pct: -0.0231 Median: +0.3705 75th pct: +0.7808 95th pct: +1.4419 Max: +7.4337 ================================================================================ Period: 2021 | Model: pyGETM ================================================================================ Analysed: 2026-05-07 07:54:55 --- CCI-SST --- RMSE: 0.9056 Bias: +0.4168 MAE: 0.7069 Correlation: 0.9044 N points: 2,150,176 Model mean: 11.2643 Obs mean: 10.8476 Model std: 4.3819 Obs std: 4.1594 Error distribution: Min: -6.4133 5th pct: -0.7551 25th pct: -0.0254 Median: +0.4099 75th pct: +0.8400 95th pct: +1.6379 Max: +6.6665 ================================================================================ Period: 2022 | Model: pyGETM ================================================================================ Analysed: 2026-05-07 07:54:55 --- CCI-SST --- RMSE: 0.7620 Bias: +0.2979 MAE: 0.5932 Correlation: 0.9306 N points: 2,150,215 Model mean: 11.6401 Obs mean: 11.3423 Model std: 4.1089 Obs std: 3.9947 Error distribution: Min: -6.0376 5th pct: -0.7399 25th pct: -0.0999 Median: +0.2869 75th pct: +0.6851 95th pct: +1.3830 Max: +7.7539 ================================================================================ Period: 2023 | Model: pyGETM ================================================================================ Analysed: 2026-05-07 07:54:55 --- CCI-SST --- RMSE: 0.9326 Bias: +0.5140 MAE: 0.7450 Correlation: 0.9144 N points: 2,150,185 Model mean: 11.7807 Obs mean: 11.2667 Model std: 4.2088 Obs std: 3.9895 Error distribution: Min: -7.3122 5th pct: -0.6414 25th pct: +0.0481 Median: +0.5039 75th pct: +0.9512 95th pct: +1.6932 Max: +8.4914 📄 Download Statistics Report (txt) · 📄 YAML\nPlots Full Period SALT_SURFACE Salinity (surface) — monthly by year\nSalinity (surface) — monthly statistics\nCCI-SSS Salinity (surface) — CCI-SSS comparison\nSalinity (surface) — CCI-SSS monthly maps\nSalinity (surface) — CCI-SSS monthly taylor\nSalinity (surface) — CCI-SSS pdf annual\nSalinity (surface) — CCI-SSS pdf monthly\nSalinity (surface) — CCI-SSS spatial stats\nTEMP_SURFACE Temperature (surface) — monthly by year\nTemperature (surface) — monthly by year CCI-SST\nTemperature (surface) — monthly by year OSTIA\nTemperature (surface) — monthly statistics\nCCI-SST Temperature (surface) — CCI-SST comparison\nTemperature (surface) — CCI-SST monthly maps\nTemperature (surface) — CCI-SST monthly taylor\nTemperature (surface) — CCI-SST pdf annual\nTemperature (surface) — CCI-SST pdf monthly\nTemperature (surface) — CCI-SST spatial stats\nOSTIA Temperature (surface) — OSTIA comparison\nTemperature (surface) — OSTIA monthly maps\nTemperature (surface) — OSTIA monthly taylor\nTemperature (surface) — OSTIA pdf annual\nTemperature (surface) — OSTIA pdf monthly\nTemperature (surface) — OSTIA spatial stats\nSALT_BOTTOM Salinity (bottom) — monthly by year\nNWS-salinity Salinity (bottom) — NWS-salinity comparison\nSalinity (bottom) — NWS-salinity monthly maps\nSalinity (bottom) — NWS-salinity pdf annual\nSalinity (bottom) — NWS-salinity pdf monthly\nSalinity (bottom) — NWS-salinity spatial stats\nTEMP_BOTTOM Temperature (bottom) — monthly by year\nNWS-bottomT Temperature (bottom) — NWS-bottomT comparison\nTemperature (bottom) — NWS-bottomT monthly maps\nTemperature (bottom) — NWS-bottomT pdf annual\nTemperature (bottom) — NWS-bottomT pdf monthly\nTemperature (bottom) — NWS-bottomT spatial stats\nTaylor diagram\nTaylor diagram\nGridded 3D Validation Statistics SALT_3D Metric WOA RMSE 1.8657 Bias -0.4047 MAE 0.6013 Corr 0.8484 Model mean 34.2831 Obs mean 34.6877 View Full Statistics Report ################################################################################ SALT Validation Statistics ################################################################################ Format: 1.1 Created: 2026-05-04 08:56:01 Author: KB Project: OceanICU Institute: BB Area: NS Experiment: CMEMS ################################################################################ ================================================================================ Period: 2016-2023 | Model: pyGETM ================================================================================ Analysed: 2026-05-07 07:47:04 --- WOA --- RMSE: 1.8657 Bias: -0.4047 MAE: 0.6013 Correlation: 0.8484 N points: 13,890,240 Model mean: 34.2831 Obs mean: 34.6877 Model std: 2.9459 Obs std: 1.5586 Error distribution: Min: -24.5625 5th pct: -1.8974 25th pct: -0.3434 Median: -0.0322 75th pct: +0.1224 95th pct: +0.4691 Max: +3.3153 Monthly breakdown: Month RMSE Bias MAE Corr -------------------------------------------- Jan 1.7050 -0.3468 0.5380 0.8623 Feb 1.7717 -0.3784 0.5559 0.8529 Mar 1.8752 -0.4176 0.6083 0.8424 Apr 1.9813 -0.4203 0.6472 0.8255 May 2.0577 -0.4902 0.6740 0.8301 Jun 2.0936 -0.5069 0.6727 0.8243 Jul 1.8502 -0.4147 0.6128 0.8580 Aug 1.8730 -0.3900 0.6055 0.8505 Sep 1.8779 -0.3860 0.6026 0.8536 Oct 1.7620 -0.3621 0.5784 0.8582 Nov 1.7447 -0.3609 0.5628 0.8665 Dec 1.7492 -0.3820 0.5578 0.8667 -------------------------------------------- All 1.8657 -0.4047 0.6013 0.8484 📄 Download Statistics Report (txt) · 📄 YAML\nTEMP_3D Metric WOA RMSE 1.6707 Bias +1.0188 MAE 1.2186 Corr 0.9159 Model mean 10.0176 Obs mean 8.9989 View Full Statistics Report ################################################################################ TEMP Validation Statistics ################################################################################ Format: 1.1 Created: 2026-05-04 08:53:34 Author: KB Project: OceanICU Institute: BB Area: NS Experiment: CMEMS ################################################################################ ================================================================================ Period: 2016-2023 | Model: pyGETM ================================================================================ Analysed: 2026-05-07 07:44:30 --- WOA --- RMSE: 1.6707 Bias: +1.0188 MAE: 1.2186 Correlation: 0.9159 N points: 13,890,240 Model mean: 10.0176 Obs mean: 8.9989 Model std: 3.2017 Obs std: 2.6140 Error distribution: Min: -6.6442 5th pct: -0.7176 25th pct: +0.2210 Median: +0.8370 75th pct: +1.5528 95th pct: +3.5470 Max: +13.1985 Monthly breakdown: Month RMSE Bias MAE Corr -------------------------------------------- Jan 1.1679 +0.9188 0.9935 0.8086 Feb 1.0994 +0.7241 0.9076 0.7966 Mar 1.1261 +0.7865 0.9587 0.7863 Apr 1.1238 +0.8775 0.9654 0.7850 May 1.6636 +1.2549 1.3121 0.7386 Jun 2.5178 +1.7070 1.8241 0.8487 Jul 2.7206 +1.8489 2.0350 0.9015 Aug 2.3442 +1.5336 1.8193 0.9308 Sep 1.7704 +1.0528 1.3980 0.9272 Oct 1.2028 +0.5534 0.9266 0.8983 Nov 1.1107 +0.6937 0.8757 0.8433 Dec 0.7579 +0.2738 0.6068 0.7978 -------------------------------------------- All 1.6707 +1.0188 1.2186 0.9159 📄 Download Statistics Report (txt) · 📄 YAML\nPlots Full Period Salinity at 5 m depth — model vs observations comparison\nSalinity at 5 m depth — spatial distribution of statistics\nSalinity at 50 m depth — model vs observations comparison\nSalinity at 50 m depth — spatial distribution of statistics\nSalinity at 100 m depth — model vs observations comparison\nSalinity at 100 m depth — spatial distribution of statistics\nSalinity at 200 m depth — model vs observations comparison\nSalinity at 200 m depth — spatial distribution of statistics\nSalinity at 500 m depth — model vs observations comparison\nSalinity at 500 m depth — spatial distribution of statistics\nSalinity — monthly 3D profile statistics\nSalinity — monthly 3D Taylor diagram\nTaylor diagram\nTemperature at 5 m depth — model vs observations comparison\nTemperature at 5 m depth — spatial distribution of statistics\nTemperature at 50 m depth — model vs observations comparison\nTemperature at 50 m depth — spatial distribution of statistics\nTemperature at 100 m depth — model vs observations comparison\nTemperature at 100 m depth — spatial distribution of statistics\nTemperature at 200 m depth — model vs observations comparison\nTemperature at 200 m depth — spatial distribution of statistics\nTemperature at 500 m depth — model vs observations comparison\nTemperature at 500 m depth — spatial distribution of statistics\nTemperature — monthly 3D profile statistics\nTemperature — monthly 3D Taylor diagram\nICES Point Profiles Statistics PSAL Metric ICES point observations RMSE 2.9193 Bias -0.8519 MAE 1.1703 Corr 0.9527 Model mean 31.3225 Obs mean 32.1743 View Full Statistics Report ################################################################################ PSAL Profile Validation Statistics ################################################################################ Format: 1.1 Created: 2026-05-04 08:33:44 Area: NS Experiment: CMEMS ################################################################################ ================================================================================ Period: 2016-2023 | Model: pyGETM ================================================================================ Analysed: 2026-05-07 07:47:45 --- ICES point observations --- RMSE: 2.9193 Bias: -0.8519 MAE: 1.1703 Correlation: 0.9527 N points: 2,237,954 N profiles: 27,972 Model mean: 31.3225 Obs mean: 32.1743 Model std: 8.1132 Obs std: 6.4210 Error distribution: Min: -25.9221 5th pct: -7.5945 25th pct: -0.3312 Median: -0.0157 75th pct: +0.1035 95th pct: +0.6890 Max: +34.1564 Statistics by depth: Depth N Bias RMSE Corr ------------------------------------------------------ 0-10m 389,613 -2.4538 4.8389 0.9367 10-25m 412,998 -1.9975 4.5901 0.9273 25-50m 407,979 -0.3030 1.7006 0.9215 50-100m 463,619 -0.0292 0.3479 0.7667 100-200m 324,278 +0.0198 0.1800 0.6268 200-500m 224,657 +0.0208 0.0845 0.3426 500-1000m 14,810 +0.0429 0.0607 0.2832 📄 Download Statistics Report (txt) · 📄 YAML\nTEMP Metric ICES point observations RMSE 1.3532 Bias +0.0862 MAE 0.8901 Corr 0.9249 Model mean 9.4227 Obs mean 9.3365 View Full Statistics Report ################################################################################ TEMP Profile Validation Statistics ################################################################################ Format: 1.1 Created: 2026-05-04 08:32:26 Area: NS Experiment: CMEMS ################################################################################ ================================================================================ Period: 2016-2023 | Model: pyGETM ================================================================================ Analysed: 2026-05-07 07:46:28 --- ICES point observations --- RMSE: 1.3532 Bias: +0.0862 MAE: 0.8901 Correlation: 0.9249 N points: 2,247,321 N profiles: 25,948 Model mean: 9.4227 Obs mean: 9.3365 Model std: 3.4961 Obs std: 3.4722 Error distribution: Min: -11.0420 5th pct: -1.9490 25th pct: -0.4677 Median: +0.0784 75th pct: +0.6593 95th pct: +2.1014 Max: +10.4338 Statistics by depth: Depth N Bias RMSE Corr ------------------------------------------------------ 0-10m 389,474 +0.3763 1.5207 0.9614 10-25m 415,226 -0.0822 1.7830 0.9127 25-50m 410,379 -0.3621 1.6032 0.8250 50-100m 466,017 +0.1302 0.9960 0.7561 100-200m 325,997 +0.1971 0.8095 0.5620 200-500m 225,418 +0.4180 0.8186 0.4674 500-1000m 14,810 +0.7216 0.9221 0.2511 📄 Download Statistics Report (txt) · 📄 YAML\nPlots Practical Salinity — statistics vs depth profile\nTemperature — statistics vs depth profile\nArgo Float Profiles Statistics PSAL Metric ARGO floats RMSE 0.4500 Bias -0.1398 MAE 0.2464 Corr 0.8794 Model mean 34.6889 Obs mean 34.8287 View Full Statistics Report ################################################################################ PSAL Profile Validation Statistics ################################################################################ Format: 1.1 Created: 2026-05-04 14:14:33 Area: NS Experiment: CMEMS ################################################################################ ================================================================================ Period: 2016-2023 | Model: pyGETM ================================================================================ Analysed: 2026-05-07 07:47:09 --- ARGO floats --- RMSE: 0.4500 Bias: -0.1398 MAE: 0.2464 Correlation: 0.8794 N points: 9,278 N profiles: 38 Model mean: 34.6889 Obs mean: 34.8287 Model std: 0.8658 Obs std: 0.8759 Error distribution: Min: -3.7714 5th pct: -0.8425 25th pct: -0.1965 Median: -0.0896 75th pct: -0.0238 95th pct: +0.2093 Max: +4.0651 Statistics by depth: Depth N Bias RMSE Corr ------------------------------------------------------ 0-10m 190 -0.1729 1.5569 0.7362 10-25m 537 -0.0585 1.0630 0.7689 25-50m 861 -0.1621 0.5930 0.7992 50-100m 1,730 -0.2388 0.4535 0.5422 100-200m 2,809 -0.1459 0.1991 0.6350 200-500m 2,940 -0.0912 0.1190 -0.1755 500-1000m 211 -0.0105 0.0134 -0.4413 📄 Download Statistics Report (txt) · 📄 YAML\nTEMP Metric ARGO floats RMSE 1.0344 Bias +0.1992 MAE 0.6657 Corr 0.8754 Model mean 8.8561 Obs mean 8.6569 View Full Statistics Report ################################################################################ TEMP Profile Validation Statistics ################################################################################ Format: 1.1 Created: 2026-05-04 14:14:31 Area: NS Experiment: CMEMS ################################################################################ ================================================================================ Period: 2016-2023 | Model: pyGETM ================================================================================ Analysed: 2026-05-07 07:47:07 --- ARGO floats --- RMSE: 1.0344 Bias: +0.1992 MAE: 0.6657 Correlation: 0.8754 N points: 9,278 N profiles: 38 Model mean: 8.8561 Obs mean: 8.6569 Model std: 1.7953 Obs std: 2.0977 Error distribution: Min: -4.2178 5th pct: -1.6228 25th pct: -0.0857 Median: +0.1423 75th pct: +0.6191 95th pct: +1.9013 Max: +4.9314 Statistics by depth: Depth N Bias RMSE Corr ------------------------------------------------------ 0-10m 190 -0.3018 1.0140 0.9402 10-25m 537 -0.1033 1.5451 0.7958 25-50m 861 -0.2594 1.9319 0.6892 50-100m 1,730 +0.2955 1.4590 0.5229 100-200m 2,809 +0.3043 0.6051 0.6492 200-500m 2,940 +0.2119 0.3411 0.6579 500-1000m 211 +0.9276 0.9310 -0.4030 📄 Download Statistics Report (txt) · 📄 YAML\nPlots Argo float profile overview (NE Atlantic)\nNA_ARGO — Hovmöller diagram\nNa Argo Overview\nPractical Salinity — statistics vs depth profile\nTemperature — statistics vs depth profile\nObservations ARGO Observations — 2016-2023 ARGO Station Map\nARGO Observation Density\nARGO Hovmoller\nICES Observations — 2016-2023 ICES Station Map\nICES Observation Density\nICES PSAL Hovmoller\nICES TEMP Hovmoller\nMethodology Horizontal Validation Model surface fields compared against gridded satellite products and in-situ observations.\nStatistics: RMSE, Bias, MAE, Pearson correlation.\nSpatial statistics show the error distribution across the domain.\nGridded 3D Validation Model vertical profiles compared against gridded 3D climatologies.\nStatistics: RMSE and Bias at each depth level.\nICES Point Profiles Quality-controlled hydrographic profiles from the ICES data portal (temperature, salinity, biogeochemical variables).\nArgo Float Profiles Autonomous profiling floats providing temperature and salinity profiles to 2000 m depth (Ifremer ERDDAP).\n← Back to NS View All Validations →\n","permalink":"https://bolding-bruggeman.com/oceanicu_3d/validations/ns-cmems/","summary":"\u003cp\u003eHorizontal Validation results comparing model output against observations.\u003c/p\u003e\n\u003ch2 id=\"experiment-information\"\u003eExperiment Information\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eArea\u003c/strong\u003e: NS\n\u003cstrong\u003eExperiment\u003c/strong\u003e: CMEMS\n\u003cstrong\u003eValidation Type\u003c/strong\u003e: Horizontal Validation\n\u003cstrong\u003eVariables\u003c/strong\u003e: SALT_BOTTOM, TEMP_BOTTOM, SALT_SURFACE, TEMP_SURFACE\u003c/p\u003e\n\u003ch2 id=\"overview\"\u003eOverview\u003c/h2\u003e\n\u003ctable\u003e\n  \u003cthead\u003e\n      \u003ctr\u003e\n          \u003cth\u003eMetric\u003c/th\u003e\n          \u003cth\u003eSALT_BOTTOM / NWS-salinity\u003c/th\u003e\n          \u003cth\u003eTEMP_BOTTOM / NWS-bottomT\u003c/th\u003e\n          \u003cth\u003eSALT_SURFACE / CCI-SSS\u003c/th\u003e\n          \u003cth\u003eTEMP_SURFACE / OSTIA\u003c/th\u003e\n          \u003cth\u003eTEMP_SURFACE / CCI-SST\u003c/th\u003e\n      \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eRMSE\u003c/td\u003e\n          \u003ctd\u003e0.4879\u003c/td\u003e\n          \u003ctd\u003e1.4122\u003c/td\u003e\n          \u003ctd\u003e2.2332\u003c/td\u003e\n          \u003ctd\u003e0.8598\u003c/td\u003e\n          \u003ctd\u003e0.8541\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eBias\u003c/td\u003e\n          \u003ctd\u003e0.0749\u003c/td\u003e\n          \u003ctd\u003e-0.6136\u003c/td\u003e\n          \u003ctd\u003e-0.1010\u003c/td\u003e\n          \u003ctd\u003e0.1970\u003c/td\u003e\n          \u003ctd\u003e0.4024\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eCorr\u003c/td\u003e\n          \u003ctd\u003e0.8398\u003c/td\u003e\n          \u003ctd\u003e0.9208\u003c/td\u003e\n          \u003ctd\u003e0.9219\u003c/td\u003e\n          \u003ctd\u003e0.9010\u003c/td\u003e\n          \u003ctd\u003e0.9213\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eN points\u003c/td\u003e\n          \u003ctd\u003e58,068\u003c/td\u003e\n          \u003ctd\u003e58,068\u003c/td\u003e\n          \u003ctd\u003e16,531,480\u003c/td\u003e\n          \u003ctd\u003e2,003,850\u003c/td\u003e\n          \u003ctd\u003e17,213,415\u003c/td\u003e\n      \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch3 id=\"annual-statistics-trends\"\u003eAnnual Statistics Trends\u003c/h3\u003e\n\u003cp\u003e\u003cimg alt=\"Salinity (surface) — annual statistics timeseries (RMSE, bias, correlation)\" loading=\"lazy\" src=\"/validation-data/ns-cmems/physics/pyGETM/2016-2023/surface/salt_surface_timeseries_statistics.png\"\u003e\n\u003cem\u003eSalinity (surface) — annual statistics timeseries (RMSE, bias, correlation)\u003c/em\u003e\u003c/p\u003e","title":"NS - Experiment CMEMS"},{"content":"Horizontal Validation results comparing model output against observations.\nExperiment Information Area: NS Experiment: ObsKd Validation Type: Horizontal Validation Variables:\nICES Point Profiles Statistics PSAL Metric ICES point observations RMSE 2.6434 Bias +0.5740 MAE 1.2680 Corr 0.9531 Model mean 32.7412 Obs mean 32.1672 View Full Statistics Report ################################################################################ PSAL Profile Validation Statistics ################################################################################ Format: 1.1 Created: 2026-05-04 11:51:39 Area: NS Experiment: ObsKd ################################################################################ ================================================================================ Period: 2016-2023 | Model: pyGETM ================================================================================ Analysed: 2026-05-04 12:41:44 --- ICES point observations --- RMSE: 2.6434 Bias: +0.5740 MAE: 1.2680 Correlation: 0.9531 N points: 2,239,479 N profiles: 27,982 Model mean: 32.7412 Obs mean: 32.1672 Model std: 4.4321 Obs std: 6.4284 Error distribution: Min: -17.1605 5th pct: -1.1617 25th pct: -0.5281 Median: -0.1850 75th pct: +0.1386 95th pct: +7.4418 Max: +33.6755 Statistics by depth: Depth N Bias RMSE Corr ------------------------------------------------------ 0-10m 391,138 +3.3694 5.3929 0.9248 10-25m 412,998 +0.8098 2.8412 0.9538 25-50m 407,979 -0.2014 1.3491 0.9566 50-100m 463,619 -0.3414 0.5469 0.5932 100-200m 324,278 -0.2727 0.3814 0.5929 200-500m 224,657 -0.1603 0.2193 0.6298 500-1000m 14,810 -0.1424 0.1656 0.6084 📄 Download Statistics Report (txt) · 📄 YAML\nTEMP Metric ICES point observations RMSE 1.3815 Bias -0.1003 MAE 0.9583 Corr 0.9258 Model mean 9.2372 Obs mean 9.3375 View Full Statistics Report ################################################################################ TEMP Profile Validation Statistics ################################################################################ Format: 1.1 Created: 2026-05-04 11:50:20 Area: NS Experiment: ObsKd ################################################################################ ================================================================================ Period: 2016-2023 | Model: pyGETM ================================================================================ Analysed: 2026-05-04 12:40:26 --- ICES point observations --- RMSE: 1.3815 Bias: -0.1003 MAE: 0.9583 Correlation: 0.9258 N points: 2,248,852 N profiles: 25,958 Model mean: 9.2372 Obs mean: 9.3375 Model std: 3.6331 Obs std: 3.4748 Error distribution: Min: -11.7818 5th pct: -2.2092 25th pct: -0.7782 Median: -0.1531 75th pct: +0.5355 95th pct: +2.0671 Max: +12.0725 Statistics by depth: Depth N Bias RMSE Corr ------------------------------------------------------ 0-10m 391,005 +0.4440 1.6309 0.9569 10-25m 415,226 +0.0842 1.7929 0.9175 25-50m 410,379 -0.5606 1.5581 0.8511 50-100m 466,017 -0.5101 1.1481 0.7016 100-200m 325,997 -0.1651 0.7370 0.4822 200-500m 225,418 +0.3233 0.7020 0.3093 500-1000m 14,810 +0.9814 1.1101 0.0354 📄 Download Statistics Report (txt) · 📄 YAML\nPlots Practical Salinity — statistics vs depth profile\nTemperature — statistics vs depth profile\nArgo Float Profiles Statistics PSAL Metric ARGO floats RMSE 0.7043 Bias -0.2443 MAE 0.4716 Corr 0.6650 Model mean 34.5844 Obs mean 34.8287 View Full Statistics Report ################################################################################ PSAL Profile Validation Statistics ################################################################################ Format: 1.1 Created: 2026-05-04 14:11:03 Area: NS Experiment: ObsKd ################################################################################ ================================================================================ Period: 2016-2023 | Model: pyGETM ================================================================================ Analysed: 2026-05-04 21:16:57 --- ARGO floats --- RMSE: 0.7043 Bias: -0.2443 MAE: 0.4716 Correlation: 0.6650 N points: 9,278 N profiles: 38 Model mean: 34.5844 Obs mean: 34.8287 Model std: 0.4900 Obs std: 0.8759 Error distribution: Min: -1.3822 5th pct: -0.8706 25th pct: -0.5215 Median: -0.3350 75th pct: -0.1588 95th pct: +0.4990 Max: +6.8484 Statistics by depth: Depth N Bias RMSE Corr ------------------------------------------------------ 0-10m 190 +1.5709 2.4012 0.6141 10-25m 537 +0.6735 1.6576 0.4305 25-50m 861 -0.2808 0.8373 0.4802 50-100m 1,730 -0.5369 0.6342 0.5661 100-200m 2,809 -0.3871 0.4406 0.6533 200-500m 2,940 -0.2177 0.2491 -0.3770 500-1000m 211 -0.1371 0.1396 0.7297 📄 Download Statistics Report (txt) · 📄 YAML\nTEMP Metric ARGO floats RMSE 1.0839 Bias -0.0411 MAE 0.7363 Corr 0.8714 Model mean 8.6158 Obs mean 8.6569 View Full Statistics Report ################################################################################ TEMP Profile Validation Statistics ################################################################################ Format: 1.1 Created: 2026-05-04 14:11:01 Area: NS Experiment: ObsKd ################################################################################ ================================================================================ Period: 2016-2023 | Model: pyGETM ================================================================================ Analysed: 2026-05-04 21:16:55 --- ARGO floats --- RMSE: 1.0839 Bias: -0.0411 MAE: 0.7363 Correlation: 0.8714 N points: 9,278 N profiles: 38 Model mean: 8.6158 Obs mean: 8.6569 Model std: 1.4896 Obs std: 2.0977 Error distribution: Min: -5.2515 5th pct: -2.3758 25th pct: -0.4345 Median: +0.2245 75th pct: +0.4218 95th pct: +1.2268 Max: +4.5751 Statistics by depth: Depth N Bias RMSE Corr ------------------------------------------------------ 0-10m 190 -0.8952 1.3505 0.9282 10-25m 537 -0.7188 1.8560 0.7388 25-50m 861 -0.9151 2.2419 0.6400 50-100m 1,730 -0.2902 1.2784 0.6638 100-200m 2,809 +0.0930 0.4554 0.6657 200-500m 2,940 +0.3228 0.4734 0.1766 500-1000m 211 +1.2067 1.2088 0.4673 📄 Download Statistics Report (txt) · 📄 YAML\nPlots Argo float profile overview (NE Atlantic)\nNA_ARGO — Hovmöller diagram\nNa Argo Overview\nPractical Salinity — statistics vs depth profile\nTemperature — statistics vs depth profile\nObservations ARGO Observations — 2016-2023 ARGO Station Map\nARGO Observation Density\nARGO Hovmoller\nICES Observations — 2016-2023 ICES Station Map\nICES Observation Density\nICES PSAL Hovmoller\nICES TEMP Hovmoller\nMethodology ICES Point Profiles Quality-controlled hydrographic profiles from the ICES data portal (temperature, salinity, biogeochemical variables).\nArgo Float Profiles Autonomous profiling floats providing temperature and salinity profiles to 2000 m depth (Ifremer ERDDAP).\n← Back to NS View All Validations →\n","permalink":"https://bolding-bruggeman.com/oceanicu_3d/validations/ns-obskd/","summary":"\u003cp\u003eHorizontal Validation results comparing model output against observations.\u003c/p\u003e\n\u003ch2 id=\"experiment-information\"\u003eExperiment Information\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eArea\u003c/strong\u003e: NS\n\u003cstrong\u003eExperiment\u003c/strong\u003e: ObsKd\n\u003cstrong\u003eValidation Type\u003c/strong\u003e: Horizontal Validation\n\u003cstrong\u003eVariables\u003c/strong\u003e:\u003c/p\u003e\n\u003ch2 id=\"ices-point-profiles\"\u003eICES Point Profiles\u003c/h2\u003e\n\u003ch3 id=\"statistics\"\u003eStatistics\u003c/h3\u003e\n\u003ch3 id=\"psal\"\u003ePSAL\u003c/h3\u003e\n\u003ctable\u003e\n  \u003cthead\u003e\n      \u003ctr\u003e\n          \u003cth\u003eMetric\u003c/th\u003e\n          \u003cth\u003eICES point observations\u003c/th\u003e\n      \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eRMSE\u003c/td\u003e\n          \u003ctd\u003e2.6434\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eBias\u003c/td\u003e\n          \u003ctd\u003e+0.5740\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eMAE\u003c/td\u003e\n          \u003ctd\u003e1.2680\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eCorr\u003c/td\u003e\n          \u003ctd\u003e0.9531\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eModel mean\u003c/td\u003e\n          \u003ctd\u003e32.7412\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eObs mean\u003c/td\u003e\n          \u003ctd\u003e32.1672\u003c/td\u003e\n      \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\u003cdetails\u003e\n\u003csummary\u003eView Full Statistics Report\u003c/summary\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e################################################################################\nPSAL Profile Validation Statistics\n################################################################################\n  Format:     1.1\n  Created:    2026-05-04 11:51:39\n  Area:         NS\n  Experiment:   ObsKd\n################################################################################\n\n================================================================================\nPeriod: 2016-2023  |  Model: pyGETM\n================================================================================\nAnalysed: 2026-05-04  12:41:44\n\n--- ICES point observations ---\n  RMSE:          2.6434\n  Bias:         +0.5740\n  MAE:           1.2680\n  Correlation:   0.9531\n  N points:      2,239,479\n  N profiles:    27,982\n  Model mean:   32.7412\n  Obs mean:     32.1672\n  Model std:    4.4321\n  Obs std:      6.4284\n\n  Error distribution:\n    Min:         -17.1605\n    5th pct:      -1.1617\n    25th pct:     -0.5281\n    Median:       -0.1850\n    75th pct:     +0.1386\n    95th pct:     +7.4418\n    Max:         +33.6755\n\n  Statistics by depth:\n  Depth               N        Bias        RMSE      Corr\n  ------------------------------------------------------\n  0-10m         391,138     +3.3694      5.3929    0.9248\n  10-25m        412,998     +0.8098      2.8412    0.9538\n  25-50m        407,979     -0.2014      1.3491    0.9566\n  50-100m       463,619     -0.3414      0.5469    0.5932\n  100-200m      324,278     -0.2727      0.3814    0.5929\n  200-500m      224,657     -0.1603      0.2193    0.6298\n  500-1000m      14,810     -0.1424      0.1656    0.6084\n\u003c/code\u003e\u003c/pre\u003e\u003c/details\u003e\n\u003cp\u003e\u003ca href=\"/validation-data/ns-obskd/psal_ices_validation_statistics.txt\"\u003e📄 Download Statistics Report (txt)\u003c/a\u003e · \u003ca href=\"/validation-data/ns-obskd/psal_ices_validation_statistics.yaml\"\u003e📄 YAML\u003c/a\u003e\u003c/p\u003e","title":"NS - Experiment ObsKd"},{"content":"Horizontal Validation results comparing model output against observations.\nExperiment Information Area: NS Experiment: SSR_SRT Validation Type: Horizontal Validation Variables:\nArgo Float Profiles Plots Argo float profile overview (NE Atlantic)\nNA_ARGO — Hovmöller diagram\nObservations ARGO Observations — 2016-2023 ARGO Station Map\nARGO Observation Density\nARGO Hovmoller\nICES Observations — 2016-2023 ICES Station Map\nICES Observation Density\nICES PSAL Hovmoller\nICES TEMP Hovmoller\nMethodology Argo Float Profiles Autonomous profiling floats providing temperature and salinity profiles to 2000 m depth (Ifremer ERDDAP).\n← Back to NS View All Validations →\n","permalink":"https://bolding-bruggeman.com/oceanicu_3d/validations/ns-ssr-srt/","summary":"\u003cp\u003eHorizontal Validation results comparing model output against observations.\u003c/p\u003e\n\u003ch2 id=\"experiment-information\"\u003eExperiment Information\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eArea\u003c/strong\u003e: NS\n\u003cstrong\u003eExperiment\u003c/strong\u003e: SSR_SRT\n\u003cstrong\u003eValidation Type\u003c/strong\u003e: Horizontal Validation\n\u003cstrong\u003eVariables\u003c/strong\u003e:\u003c/p\u003e\n\u003ch2 id=\"argo-float-profiles\"\u003eArgo Float Profiles\u003c/h2\u003e\n\u003ch3 id=\"plots\"\u003ePlots\u003c/h3\u003e\n\u003cp\u003e\u003cimg alt=\"Argo float profile overview (NE Atlantic)\" loading=\"lazy\" src=\"/validation-data/ns-ssr-srt/physics/pyGETM/2016-2023/argo/na_argo_argo_overview.png\"\u003e\n\u003cem\u003eArgo float profile overview (NE Atlantic)\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg alt=\"NA_ARGO — Hovmöller diagram\" loading=\"lazy\" src=\"/validation-data/ns-ssr-srt/physics/pyGETM/2016-2023/argo/na_argo_hovmoller.png\"\u003e\n\u003cem\u003eNA_ARGO — Hovmöller diagram\u003c/em\u003e\u003c/p\u003e\n\u003ch2 id=\"observations\"\u003eObservations\u003c/h2\u003e\n\u003ch3 id=\"argo-observations--2016-2023\"\u003eARGO Observations — 2016-2023\u003c/h3\u003e\n\u003cp\u003e\u003cimg alt=\"ARGO Station Map\" loading=\"lazy\" src=\"/areas/ns/obs/argo/2016-2023/argo_station_map.png\"\u003e\n\u003cem\u003eARGO Station Map\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg alt=\"ARGO Observation Density\" loading=\"lazy\" src=\"/areas/ns/obs/argo/2016-2023/argo_observation_density.png\"\u003e\n\u003cem\u003eARGO Observation Density\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg alt=\"ARGO Hovmoller\" loading=\"lazy\" src=\"/areas/ns/obs/argo/2016-2023/argo_hovmoller.png\"\u003e\n\u003cem\u003eARGO Hovmoller\u003c/em\u003e\u003c/p\u003e\n\u003ch3 id=\"ices-observations--2016-2023\"\u003eICES Observations — 2016-2023\u003c/h3\u003e\n\u003cp\u003e\u003cimg alt=\"ICES Station Map\" loading=\"lazy\" src=\"/areas/ns/obs/ices/2016-2023/ices_station_map.png\"\u003e\n\u003cem\u003eICES Station Map\u003c/em\u003e\u003c/p\u003e","title":"NS - Experiment SSR_SRT"},{"content":"Horizontal Validation results comparing model output against observations.\nExperiment Information Area: NS Experiment: SSR_STR Validation Type: Horizontal Validation Variables:\nICES Point Profiles Statistics PSAL Metric ICES point observations RMSE 2.6128 Bias +0.5482 MAE 1.2606 Corr 0.9532 Model mean 32.7154 Obs mean 32.1672 View Full Statistics Report ################################################################################ PSAL Profile Validation Statistics ################################################################################ Format: 1.1 Created: 2026-05-04 11:26:18 Area: NS Experiment: SSR_STR ################################################################################ ================================================================================ Period: 2016-2023 | Model: pyGETM ================================================================================ Analysed: 2026-05-04 12:26:47 --- ICES point observations --- RMSE: 2.6128 Bias: +0.5482 MAE: 1.2606 Correlation: 0.9532 N points: 2,239,481 N profiles: 27,982 Model mean: 32.7154 Obs mean: 32.1672 Model std: 4.4704 Obs std: 6.4284 Error distribution: Min: -17.2323 5th pct: -1.1848 25th pct: -0.5399 Median: -0.1937 75th pct: +0.1353 95th pct: +7.3387 Max: +33.6850 Statistics by depth: Depth N Bias RMSE Corr ------------------------------------------------------ 0-10m 391,140 +3.3001 5.3217 0.9252 10-25m 412,998 +0.7706 2.8114 0.9533 25-50m 407,979 -0.2155 1.3495 0.9559 50-100m 463,619 -0.3501 0.5543 0.5921 100-200m 324,278 -0.2816 0.3887 0.5903 200-500m 224,657 -0.1674 0.2266 0.6256 500-1000m 14,810 -0.1529 0.1765 0.6274 📄 Download Statistics Report (txt) · 📄 YAML\nTEMP Metric ICES point observations RMSE 1.5333 Bias -0.3752 MAE 1.0833 Corr 0.9111 Model mean 8.9623 Obs mean 9.3375 View Full Statistics Report ################################################################################ TEMP Profile Validation Statistics ################################################################################ Format: 1.1 Created: 2026-05-04 11:25:01 Area: NS Experiment: SSR_STR ################################################################################ ================================================================================ Period: 2016-2023 | Model: pyGETM ================================================================================ Analysed: 2026-05-04 12:25:30 --- ICES point observations --- RMSE: 1.5333 Bias: -0.3752 MAE: 1.0833 Correlation: 0.9111 N points: 2,248,854 N profiles: 25,958 Model mean: 8.9623 Obs mean: 9.3375 Model std: 3.5632 Obs std: 3.4748 Error distribution: Min: -12.0921 5th pct: -2.8351 25th pct: -1.0747 Median: -0.3505 75th pct: +0.3819 95th pct: +1.8738 Max: +11.6660 Statistics by depth: Depth N Bias RMSE Corr ------------------------------------------------------ 0-10m 391,007 +0.2802 1.6541 0.9521 10-25m 415,226 -0.3354 1.9470 0.9005 25-50m 410,379 -1.0574 1.9171 0.8157 50-100m 466,017 -0.7672 1.3260 0.6673 100-200m 325,997 -0.2804 0.7914 0.4649 200-500m 225,418 +0.2472 0.6540 0.3565 500-1000m 14,810 +0.8883 1.0164 0.1125 📄 Download Statistics Report (txt) · 📄 YAML\nPlots Practical Salinity — statistics vs depth profile\nTemperature — statistics vs depth profile\nArgo Float Profiles Statistics PSAL Metric ARGO floats RMSE 0.7101 Bias -0.2613 MAE 0.4852 Corr 0.6645 Model mean 34.5674 Obs mean 34.8287 View Full Statistics Report ################################################################################ PSAL Profile Validation Statistics ################################################################################ Format: 1.1 Created: 2026-05-04 13:53:31 Area: NS Experiment: SSR_STR ################################################################################ ================================================================================ Period: 2016-2023 | Model: pyGETM ================================================================================ Analysed: 2026-05-04 20:59:21 --- ARGO floats --- RMSE: 0.7101 Bias: -0.2613 MAE: 0.4852 Correlation: 0.6645 N points: 9,278 N profiles: 38 Model mean: 34.5674 Obs mean: 34.8287 Model std: 0.4949 Obs std: 0.8759 Error distribution: Min: -1.3696 5th pct: -0.8893 25th pct: -0.5426 Median: -0.3570 75th pct: -0.1703 95th pct: +0.4880 Max: +6.7908 Statistics by depth: Depth N Bias RMSE Corr ------------------------------------------------------ 0-10m 190 +1.5441 2.3774 0.6196 10-25m 537 +0.6583 1.6462 0.4397 25-50m 861 -0.2954 0.8361 0.4929 50-100m 1,730 -0.5532 0.6522 0.5743 100-200m 2,809 -0.4059 0.4617 0.6531 200-500m 2,940 -0.2340 0.2660 -0.3705 500-1000m 211 -0.1514 0.1537 0.7240 📄 Download Statistics Report (txt) · 📄 YAML\nTEMP Metric ARGO floats RMSE 1.1241 Bias -0.2111 MAE 0.7069 Corr 0.8814 Model mean 8.4458 Obs mean 8.6569 View Full Statistics Report ################################################################################ TEMP Profile Validation Statistics ################################################################################ Format: 1.1 Created: 2026-05-04 13:53:29 Area: NS Experiment: SSR_STR ################################################################################ ================================================================================ Period: 2016-2023 | Model: pyGETM ================================================================================ Analysed: 2026-05-04 20:59:19 --- ARGO floats --- RMSE: 1.1241 Bias: -0.2111 MAE: 0.7069 Correlation: 0.8814 N points: 9,278 N profiles: 38 Model mean: 8.4458 Obs mean: 8.6569 Model std: 1.3619 Obs std: 2.0977 Error distribution: Min: -5.4449 5th pct: -2.7508 25th pct: -0.5032 Median: +0.1199 75th pct: +0.3017 95th pct: +1.0448 Max: +3.6531 Statistics by depth: Depth N Bias RMSE Corr ------------------------------------------------------ 0-10m 190 -1.1746 1.5852 0.9193 10-25m 537 -1.1790 1.9816 0.7725 25-50m 861 -1.3330 2.3634 0.7053 50-100m 1,730 -0.4945 1.3302 0.6928 100-200m 2,809 -0.0131 0.4203 0.7194 200-500m 2,940 +0.2385 0.4145 0.2303 500-1000m 211 +1.1214 1.1241 -0.1636 📄 Download Statistics Report (txt) · 📄 YAML\nPlots Argo float profile overview (NE Atlantic)\nNA_ARGO — Hovmöller diagram\nNa Argo Overview\nPractical Salinity — statistics vs depth profile\nTemperature — statistics vs depth profile\nObservations ARGO Observations — 2016-2023 ARGO Station Map\nARGO Observation Density\nARGO Hovmoller\nICES Observations — 2016-2023 ICES Station Map\nICES Observation Density\nICES PSAL Hovmoller\nICES TEMP Hovmoller\nMethodology ICES Point Profiles Quality-controlled hydrographic profiles from the ICES data portal (temperature, salinity, biogeochemical variables).\nArgo Float Profiles Autonomous profiling floats providing temperature and salinity profiles to 2000 m depth (Ifremer ERDDAP).\n← Back to NS View All Validations →\n","permalink":"https://bolding-bruggeman.com/oceanicu_3d/validations/ns-ssr-str/","summary":"\u003cp\u003eHorizontal Validation results comparing model output against observations.\u003c/p\u003e\n\u003ch2 id=\"experiment-information\"\u003eExperiment Information\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eArea\u003c/strong\u003e: NS\n\u003cstrong\u003eExperiment\u003c/strong\u003e: SSR_STR\n\u003cstrong\u003eValidation Type\u003c/strong\u003e: Horizontal Validation\n\u003cstrong\u003eVariables\u003c/strong\u003e:\u003c/p\u003e\n\u003ch2 id=\"ices-point-profiles\"\u003eICES Point Profiles\u003c/h2\u003e\n\u003ch3 id=\"statistics\"\u003eStatistics\u003c/h3\u003e\n\u003ch3 id=\"psal\"\u003ePSAL\u003c/h3\u003e\n\u003ctable\u003e\n  \u003cthead\u003e\n      \u003ctr\u003e\n          \u003cth\u003eMetric\u003c/th\u003e\n          \u003cth\u003eICES point observations\u003c/th\u003e\n      \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eRMSE\u003c/td\u003e\n          \u003ctd\u003e2.6128\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eBias\u003c/td\u003e\n          \u003ctd\u003e+0.5482\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eMAE\u003c/td\u003e\n          \u003ctd\u003e1.2606\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eCorr\u003c/td\u003e\n          \u003ctd\u003e0.9532\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eModel mean\u003c/td\u003e\n          \u003ctd\u003e32.7154\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eObs mean\u003c/td\u003e\n          \u003ctd\u003e32.1672\u003c/td\u003e\n      \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\u003cdetails\u003e\n\u003csummary\u003eView Full Statistics Report\u003c/summary\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e################################################################################\nPSAL Profile Validation Statistics\n################################################################################\n  Format:     1.1\n  Created:    2026-05-04 11:26:18\n  Area:         NS\n  Experiment:   SSR_STR\n################################################################################\n\n================================================================================\nPeriod: 2016-2023  |  Model: pyGETM\n================================================================================\nAnalysed: 2026-05-04  12:26:47\n\n--- ICES point observations ---\n  RMSE:          2.6128\n  Bias:         +0.5482\n  MAE:           1.2606\n  Correlation:   0.9532\n  N points:      2,239,481\n  N profiles:    27,982\n  Model mean:   32.7154\n  Obs mean:     32.1672\n  Model std:    4.4704\n  Obs std:      6.4284\n\n  Error distribution:\n    Min:         -17.2323\n    5th pct:      -1.1848\n    25th pct:     -0.5399\n    Median:       -0.1937\n    75th pct:     +0.1353\n    95th pct:     +7.3387\n    Max:         +33.6850\n\n  Statistics by depth:\n  Depth               N        Bias        RMSE      Corr\n  ------------------------------------------------------\n  0-10m         391,140     +3.3001      5.3217    0.9252\n  10-25m        412,998     +0.7706      2.8114    0.9533\n  25-50m        407,979     -0.2155      1.3495    0.9559\n  50-100m       463,619     -0.3501      0.5543    0.5921\n  100-200m      324,278     -0.2816      0.3887    0.5903\n  200-500m      224,657     -0.1674      0.2266    0.6256\n  500-1000m      14,810     -0.1529      0.1765    0.6274\n\u003c/code\u003e\u003c/pre\u003e\u003c/details\u003e\n\u003cp\u003e\u003ca href=\"/validation-data/ns-ssr-str/psal_ices_validation_statistics.txt\"\u003e📄 Download Statistics Report (txt)\u003c/a\u003e · \u003ca href=\"/validation-data/ns-ssr-str/psal_ices_validation_statistics.yaml\"\u003e📄 YAML\u003c/a\u003e\u003c/p\u003e","title":"NS - Experiment SSR_STR"},{"content":"Horizontal Validation results comparing model output against observations.\nExperiment Information Area: NS Experiment: SSRD_STRD Validation Type: Horizontal Validation Variables:\nICES Point Profiles Statistics PSAL Metric ICES point observations RMSE 2.6506 Bias +0.5833 MAE 1.2688 Corr 0.9531 Model mean 32.7505 Obs mean 32.1671 View Full Statistics Report ################################################################################ PSAL Profile Validation Statistics ################################################################################ Format: 1.1 Created: 2026-05-04 11:29:24 Area: NS Experiment: SSRD_STRD ################################################################################ ================================================================================ Period: 2016-2023 | Model: pyGETM ================================================================================ Analysed: 2026-05-04 12:29:45 --- ICES point observations --- RMSE: 2.6506 Bias: +0.5833 MAE: 1.2688 Correlation: 0.9531 N points: 2,239,484 N profiles: 27,982 Model mean: 32.7505 Obs mean: 32.1671 Model std: 4.4246 Obs std: 6.4285 Error distribution: Min: -17.0901 5th pct: -1.1438 25th pct: -0.5232 Median: -0.1833 75th pct: +0.1464 95th pct: +7.4716 Max: +33.7238 Statistics by depth: Depth N Bias RMSE Corr ------------------------------------------------------ 0-10m 391,143 +3.3926 5.4090 0.9247 10-25m 412,998 +0.8309 2.8483 0.9538 25-50m 407,979 -0.1900 1.3492 0.9567 50-100m 463,619 -0.3383 0.5432 0.5937 100-200m 324,278 -0.2774 0.3844 0.5926 200-500m 224,657 -0.1663 0.2250 0.6311 500-1000m 14,810 -0.1490 0.1720 0.6332 📄 Download Statistics Report (txt) · 📄 YAML\nTEMP Metric ICES point observations RMSE 1.4965 Bias -0.2993 MAE 1.0425 Corr 0.9141 Model mean 9.0382 Obs mean 9.3375 View Full Statistics Report ################################################################################ TEMP Profile Validation Statistics ################################################################################ Format: 1.1 Created: 2026-05-04 11:28:06 Area: NS Experiment: SSRD_STRD ################################################################################ ================================================================================ Period: 2016-2023 | Model: pyGETM ================================================================================ Analysed: 2026-05-04 12:28:28 --- ICES point observations --- RMSE: 1.4965 Bias: -0.2993 MAE: 1.0425 Correlation: 0.9141 N points: 2,248,857 N profiles: 25,958 Model mean: 9.0382 Obs mean: 9.3375 Model std: 3.5819 Obs std: 3.4748 Error distribution: Min: -12.0064 5th pct: -2.7172 25th pct: -0.9651 Median: -0.2887 75th pct: +0.4179 95th pct: +1.9029 Max: +11.8105 Statistics by depth: Depth N Bias RMSE Corr ------------------------------------------------------ 0-10m 391,010 +0.3776 1.6201 0.9559 10-25m 415,226 -0.2426 1.9330 0.9011 25-50m 410,379 -0.9621 1.8544 0.8191 50-100m 466,017 -0.6889 1.2610 0.6829 100-200m 325,997 -0.2432 0.7630 0.4787 200-500m 225,418 +0.2723 0.6667 0.3438 500-1000m 14,810 +0.9260 1.0527 0.0836 📄 Download Statistics Report (txt) · 📄 YAML\nPlots Practical Salinity — statistics vs depth profile\nTemperature — statistics vs depth profile\nArgo Float Profiles Statistics PSAL Metric ARGO floats RMSE 0.7079 Bias -0.2535 MAE 0.4804 Corr 0.6645 Model mean 34.5752 Obs mean 34.8287 View Full Statistics Report ################################################################################ PSAL Profile Validation Statistics ################################################################################ Format: 1.1 Created: 2026-05-04 13:57:01 Area: NS Experiment: SSRD_STRD ################################################################################ ================================================================================ Period: 2016-2023 | Model: pyGETM ================================================================================ Analysed: 2026-05-04 21:02:51 --- ARGO floats --- RMSE: 0.7079 Bias: -0.2535 MAE: 0.4804 Correlation: 0.6645 N points: 9,278 N profiles: 38 Model mean: 34.5752 Obs mean: 34.8287 Model std: 0.4898 Obs std: 0.8759 Error distribution: Min: -1.3701 5th pct: -0.8747 25th pct: -0.5354 Median: -0.3484 75th pct: -0.1704 95th pct: +0.5080 Max: +6.7788 Statistics by depth: Depth N Bias RMSE Corr ------------------------------------------------------ 0-10m 190 +1.5647 2.3892 0.6275 10-25m 537 +0.6723 1.6509 0.4428 25-50m 861 -0.2840 0.8386 0.4801 50-100m 1,730 -0.5402 0.6402 0.5667 100-200m 2,809 -0.3975 0.4534 0.6555 200-500m 2,940 -0.2322 0.2638 -0.3857 500-1000m 211 -0.1526 0.1548 0.7152 📄 Download Statistics Report (txt) · 📄 YAML\nTEMP Metric ARGO floats RMSE 1.0994 Bias -0.1675 MAE 0.7025 Corr 0.8814 Model mean 8.4894 Obs mean 8.6569 View Full Statistics Report ################################################################################ TEMP Profile Validation Statistics ################################################################################ Format: 1.1 Created: 2026-05-04 13:56:59 Area: NS Experiment: SSRD_STRD ################################################################################ ================================================================================ Period: 2016-2023 | Model: pyGETM ================================================================================ Analysed: 2026-05-04 21:02:49 --- ARGO floats --- RMSE: 1.0994 Bias: -0.1675 MAE: 0.7025 Correlation: 0.8814 N points: 9,278 N profiles: 38 Model mean: 8.4894 Obs mean: 8.6569 Model std: 1.4031 Obs std: 2.0977 Error distribution: Min: -5.4898 5th pct: -2.5971 25th pct: -0.4863 Median: +0.1257 75th pct: +0.3438 95th pct: +1.0816 Max: +3.8850 Statistics by depth: Depth N Bias RMSE Corr ------------------------------------------------------ 0-10m 190 -1.0383 1.4644 0.9244 10-25m 537 -1.0189 1.8945 0.7713 25-50m 861 -1.2256 2.3249 0.6882 50-100m 1,730 -0.4670 1.2908 0.7133 100-200m 2,809 +0.0070 0.4241 0.7076 200-500m 2,940 +0.2692 0.4358 0.2069 500-1000m 211 +1.1481 1.1506 0.2311 📄 Download Statistics Report (txt) · 📄 YAML\nPlots Argo float profile overview (NE Atlantic)\nNA_ARGO — Hovmöller diagram\nNa Argo Overview\nPractical Salinity — statistics vs depth profile\nTemperature — statistics vs depth profile\nObservations ARGO Observations — 2016-2023 ARGO Station Map\nARGO Observation Density\nARGO Hovmoller\nICES Observations — 2016-2023 ICES Station Map\nICES Observation Density\nICES PSAL Hovmoller\nICES TEMP Hovmoller\nMethodology ICES Point Profiles Quality-controlled hydrographic profiles from the ICES data portal (temperature, salinity, biogeochemical variables).\nArgo Float Profiles Autonomous profiling floats providing temperature and salinity profiles to 2000 m depth (Ifremer ERDDAP).\n← Back to NS View All Validations →\n","permalink":"https://bolding-bruggeman.com/oceanicu_3d/validations/ns-ssrd-strd/","summary":"\u003cp\u003eHorizontal Validation results comparing model output against observations.\u003c/p\u003e\n\u003ch2 id=\"experiment-information\"\u003eExperiment Information\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eArea\u003c/strong\u003e: NS\n\u003cstrong\u003eExperiment\u003c/strong\u003e: SSRD_STRD\n\u003cstrong\u003eValidation Type\u003c/strong\u003e: Horizontal Validation\n\u003cstrong\u003eVariables\u003c/strong\u003e:\u003c/p\u003e\n\u003ch2 id=\"ices-point-profiles\"\u003eICES Point Profiles\u003c/h2\u003e\n\u003ch3 id=\"statistics\"\u003eStatistics\u003c/h3\u003e\n\u003ch3 id=\"psal\"\u003ePSAL\u003c/h3\u003e\n\u003ctable\u003e\n  \u003cthead\u003e\n      \u003ctr\u003e\n          \u003cth\u003eMetric\u003c/th\u003e\n          \u003cth\u003eICES point observations\u003c/th\u003e\n      \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eRMSE\u003c/td\u003e\n          \u003ctd\u003e2.6506\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eBias\u003c/td\u003e\n          \u003ctd\u003e+0.5833\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eMAE\u003c/td\u003e\n          \u003ctd\u003e1.2688\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eCorr\u003c/td\u003e\n          \u003ctd\u003e0.9531\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eModel mean\u003c/td\u003e\n          \u003ctd\u003e32.7505\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eObs mean\u003c/td\u003e\n          \u003ctd\u003e32.1671\u003c/td\u003e\n      \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\u003cdetails\u003e\n\u003csummary\u003eView Full Statistics Report\u003c/summary\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e################################################################################\nPSAL Profile Validation Statistics\n################################################################################\n  Format:     1.1\n  Created:    2026-05-04 11:29:24\n  Area:         NS\n  Experiment:   SSRD_STRD\n################################################################################\n\n================================================================================\nPeriod: 2016-2023  |  Model: pyGETM\n================================================================================\nAnalysed: 2026-05-04  12:29:45\n\n--- ICES point observations ---\n  RMSE:          2.6506\n  Bias:         +0.5833\n  MAE:           1.2688\n  Correlation:   0.9531\n  N points:      2,239,484\n  N profiles:    27,982\n  Model mean:   32.7505\n  Obs mean:     32.1671\n  Model std:    4.4246\n  Obs std:      6.4285\n\n  Error distribution:\n    Min:         -17.0901\n    5th pct:      -1.1438\n    25th pct:     -0.5232\n    Median:       -0.1833\n    75th pct:     +0.1464\n    95th pct:     +7.4716\n    Max:         +33.7238\n\n  Statistics by depth:\n  Depth               N        Bias        RMSE      Corr\n  ------------------------------------------------------\n  0-10m         391,143     +3.3926      5.4090    0.9247\n  10-25m        412,998     +0.8309      2.8483    0.9538\n  25-50m        407,979     -0.1900      1.3492    0.9567\n  50-100m       463,619     -0.3383      0.5432    0.5937\n  100-200m      324,278     -0.2774      0.3844    0.5926\n  200-500m      224,657     -0.1663      0.2250    0.6311\n  500-1000m      14,810     -0.1490      0.1720    0.6332\n\u003c/code\u003e\u003c/pre\u003e\u003c/details\u003e\n\u003cp\u003e\u003ca href=\"/validation-data/ns-ssrd-strd/psal_ices_validation_statistics.txt\"\u003e📄 Download Statistics Report (txt)\u003c/a\u003e · \u003ca href=\"/validation-data/ns-ssrd-strd/psal_ices_validation_statistics.yaml\"\u003e📄 YAML\u003c/a\u003e\u003c/p\u003e","title":"NS - Experiment SSRD_STRD"},{"content":"NS Experiment Rankings Composite-score ranking of every experiment validated for NS, one chart per validation category. See the NS overview for the full per-experiment statistics these are built from. See All Areas to compare across areas.\nHorizontal Surface Validation Only one experiment validated so far for this category — ranking needs at least two.\nHorizontal Bottom Layer Validation Only one experiment validated so far for this category — ranking needs at least two.\nGridded 3D Validation Only one experiment validated so far for this category — ranking needs at least two.\nArgo Profile Validation ICES Point Observation Profiles MLE Cross-Experiment Ranking Only one experiment validated so far for this category — ranking needs at least two.\n","permalink":"https://bolding-bruggeman.com/oceanicu_3d/rankings/ns/","summary":"\u003ch1 id=\"ns-experiment-rankings\"\u003eNS Experiment Rankings\u003c/h1\u003e\n\u003cp\u003eComposite-score ranking of every experiment validated for \u003cstrong\u003eNS\u003c/strong\u003e, one chart per validation category. See the \u003ca href=\"/validations/ns-overview/\"\u003eNS overview\u003c/a\u003e for the full per-experiment statistics these are built from. See \u003ca href=\"/rankings/all/\"\u003eAll Areas\u003c/a\u003e to compare across areas.\u003c/p\u003e\n\u003ch2 id=\"horizontal-surface-validation\"\u003eHorizontal Surface Validation\u003c/h2\u003e\n\u003cp\u003e\u003ca id=\"horizon-surface\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003cem\u003eOnly one experiment validated so far for this category — ranking needs at least two.\u003c/em\u003e\u003c/p\u003e\n\u003ch2 id=\"horizontal-bottom-layer-validation\"\u003eHorizontal Bottom Layer Validation\u003c/h2\u003e\n\u003cp\u003e\u003ca id=\"horizon-bottom\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003cem\u003eOnly one experiment validated so far for this category — ranking needs at least two.\u003c/em\u003e\u003c/p\u003e","title":"NS Rankings"},{"content":"Analysis Overview — all analysis types in one page\nBoundary Conditions — future open-boundary forcing (delta-change + tidal)\nExperiments CMEMS/spinup — validation CMEMS/tidal — tidal CMEMS/v01P — validation CMIP6/tidal — tidal CMIP6_raw/GFDL-ESM4-ssp126/run01 — scenario WOA/tidal — tidal NSe boundary condition generation — runbook Practical how-to. For dataset-level details (CMEMS product IDs, coverage dates, Baltic override rationale) see ocean-prep/docs/nse_boundary_sources.md — that doc explains what data; this one explains what to run, in what order, from where.\n0. The boundary point file — read this first Canonical copy: NSe/Bathymetry/nse_bdy_lonlat.txt (currently 311 points). Moved here from NSe/nse_bdy_lonlat.txt on 2026-08-17 — this file\u0026rsquo;s entire validity is defined by wet/land status against NSe/Bathymetry/bathymetry_nse.nc, needs re-verification after every bathymetry regeneration (see below), and lives alongside the other grid/mask artifacts there, not the YAML domain configs in NSe/config/.\nThis is the file the running model actually uses — confirmed empirically by comparing it against lon_bdy/lat_bdy in a getm-dump.nc crash dump written by a live run: exact match, 0 points different. Treat any other copy as untrustworthy until proven otherwise (see \u0026ldquo;Known copies\u0026rdquo; below).\nPolicy: this file belongs to the setup. It must live under NSe/Bathymetry/, not in ocean-prep/bdy_coords/ or boundaries.old/bdy_coords/ or the oceanicu_3d/ repo root, and not as a symlink from those locations either — every consuming config references this one real path directly (fixed 2026-08-17; see §3). Verify with ls -la / grep -rln nse_bdy_lonlat before trusting any copy if this ever looks inconsistent again.\nVerifying it against the bathymetry Every boundary point must land on a wet cell in the current NSe/Bathymetry/bathymetry_nse.nc. Check with:\nimport netCDF4, numpy as np with netCDF4.Dataset(\u0026#34;NSe/Bathymetry/bathymetry_nse.nc\u0026#34;) as nc: lon = np.array(nc[\u0026#34;lon\u0026#34;][:]); lat = np.array(nc[\u0026#34;lat\u0026#34;][:]) mask = np.array(nc[\u0026#34;ocean_mask\u0026#34;][:]).astype(bool) pts = [] with open(\u0026#34;NSe/Bathymetry/nse_bdy_lonlat.txt\u0026#34;) as f: for line in f.readlines()[2:]: line = line.strip() if not line: continue lo, la = map(float, line.split(\u0026#34;,\u0026#34;)) pts.append((lo, la)) n_land = 0 for lo, la in pts: i = int(np.argmin(np.abs(lon - lo))) j = int(np.argmin(np.abs(lat - la))) if not mask[j, i]: n_land += 1 print(\u0026#34;ON LAND:\u0026#34;, lo, la) print(f\u0026#34;{len(pts)} points, {n_land} on land\u0026#34;) Run this after every bathymetry regeneration. generate_nse_bathymetry.py (mask_regions, rx0 smoothing, thalweg fixes) can change which cells are wet — a point that was fine yesterday can end up on land today with no error or warning anywhere else. This actually happened on 2026-08-03: a fix to mask_regions rectangle-boundary floating-point tolerance (for an unrelated single-row \u0026ldquo;Humber\u0026rdquo; closure) retroactively closed the eastern edge of the pre-existing \u0026ldquo;West of Orkney\u0026rdquo; region, which had been silently not closing due to the same rounding issue. 123 of 311 points ended up on land as a side effect of a bathymetry fix that had nothing to do with boundaries.\nUpdate, 2026-08-17: re-checked against the current bathymetry_nse.nc — 0 of 311 points on land. The bathymetry has evidently been regenerated/corrected again since the above regression, independently of any boundary-point edit. A partial fix for the 123-point regression was attempted the same day it happened (121 of the 123 points moved to nearby wet cells, 2 dropped as a redundant corner vertex once both adjacent segments shifted) but landed on the wrong file (oceanicu_3d/nse_bdy_lonlat.txt at the repo root, not the canonical copy) and was never actually applied — now archived at NSe/Bathymetry/nse_bdy_lonlat.txt.mislanded_edit_20260803 for reference in case this regression (or a similar one) recurs. Always re-run the check above before trusting either \u0026ldquo;0 on land\u0026rdquo; or an old point-count from this doc — bathymetry regenerations happen independently of this file and can silently invalidate either state.\nIf a point needs to move or be dropped Back up first — always: .bak copies with a timestamp suffix if a second round of fixes is likely (see NSe/Bathymetry/nse_bdy_lonlat.txt.bak* for the pattern used so far). Edit NSe/Bathymetry/nse_bdy_lonlat.txt directly (plain lon,lat per line, header T-grid / lon,lat). If boundary_data NC files already exist (see §2 below) for the old point list, they must be re-cut to match — the point count/order in the NC files\u0026rsquo; nbdyp dimension must stay in lockstep with the text file, or pygetm will refuse to load them (\u0026quot;length 312 ... actual extent 317\u0026quot; type errors) or — worse — silently misalign points if counts happen to match by coincidence. Use NSe/trim_bdy.py \u0026lt;src.nc\u0026gt; \u0026lt;dst.nc\u0026gt; \u0026lt;idx0\u0026gt; ... to drop specific 0-based nbdyp indices from hourly/daily reference files; verify the index against boundary_lon/boundary_lat in the NC file first, not just the text file (they can drift independently — see \u0026ldquo;Known copies\u0026rdquo;). If more than a couple of points changed, it may be simpler to fully regenerate the reference data from source (§2) than to patch the NC files by hand. 1. The three-stage pipeline NSe boundary conditions are built in three independent stages, each with its own config and CLI tool (all ocean-prep, pip-installed editable — works from any cwd):\nStage Produces Tool Config 1. Historical reference boundary_data/nse/{hourly,daily}/*.nc — real CMEMS reanalysis + near-real-time forecast, 2015–present run-cmems-boundaries NSe/config/nse_bdy_create.yaml 2a. Future scenario (T/S) CMIP6/{model}/{experiment}/bdy_3d_{var}_*.nc — delta-change projection run-delta-boundaries NSe/config/nse_delta_bdy.yaml 2b. Future scenario (SSH/currents) Tidal + CMIP6 mean SSH/transport, hourly run-tidal-boundaries NSe/config/nse_tidal_bdy.yaml Stage 1 must exist before stage 2a can run — run-delta-boundaries reads the historical hourly/daily files as its cycling reference (it has no independent boundary-point list; it inherits points from those NC files' own boundary_lon/boundary_lat/segment_id variables). Stage 2b (tidal) is independent of stage 1 — it reads TPXO9 + CMIP6 directly, using NSe/Bathymetry/nse_bdy_lonlat.txt for its own point list.\nStage 1 — historical reference (CMEMS) cd /home/kb/source/repos/OceanICU/oceanicu_3d/NSe # nse_bdy_create.yaml lives here (NSe-specific, not in ocean-prep) run-cmems-boundaries --config config/nse_bdy_create.yaml --dryrun run-cmems-boundaries --config config/nse_bdy_create.yaml # selectively: run-cmems-boundaries --config config/nse_bdy_create.yaml --dataset temperature salinity run-cmems-boundaries --config config/nse_bdy_create.yaml --category physics nse_bdy_create.yaml\u0026rsquo;s boundary_points.file_path is a real absolute path directly at NSe/Bathymetry/nse_bdy_lonlat.txt — no symlink indirection (fixed 2026-08-17; every domain setup follows this same pattern, its own canonical copy in its own repo, referenced directly — a shared symlink target doesn\u0026rsquo;t generalize across setups).\nStage 2a — future scenario, temperature/salinity (delta-change) cd /home/kb/source/repos/OceanICU/oceanicu_3d/NSe run-delta-boundaries --config config/nse_delta_bdy.yaml --dryrun run-delta-boundaries --config config/nse_delta_bdy.yaml --scenario ssp126 ssp370 ssp585 run-delta-boundaries --config config/nse_delta_bdy.yaml \\ --future-start 2070-01-01 --future-end 2099-12-31 run-delta-boundaries --config config/nse_delta_bdy.yaml --variable thetao so Method: corrected(t) = AMM7/AMM15_ref(t_analog) + [CMIP6_future_clim(month) − CMIP6_hist_clim(month)], where t_analog cycles through the historical reference period (same calendar day/hour, year mapped modulo the reference length). Safe to run as long as stage 1\u0026rsquo;s hourly/daily files are current and correctly aligned with NSe/Bathymetry/nse_bdy_lonlat.txt (they inherit its point layout automatically from their own boundary_lon/boundary_lat/segment_id).\nStage 2b — future scenario, SSH/currents (tidal + CMIP6) cd /home/kb/source/repos/OceanICU/oceanicu_3d/NSe run-tidal-boundaries --config config/nse_tidal_bdy.yaml --dryrun run-tidal-boundaries --config config/nse_tidal_bdy.yaml run-tidal-boundaries --config config/nse_tidal_bdy.yaml --start 2060-01-01 --end 2060-12-31 run-tidal-boundaries --config config/nse_tidal_bdy.yaml --model UKESM1-0-LL --scenario ssp126 NSe/config/nse_tidal_bdy.yaml\u0026rsquo;s file_path is ./Bathymetry/nse_bdy_lonlat.txt, a relative path resolved against the working directory — must still be run with cwd = NSe/.\n2. Post-generation sanity checks Re-run the land/water check in §0 if the bathymetry changed since the NC files were last built. nc_nan_scan.py (repo root, oceanicu_3d/nc_nan_scan.py) can scan any resulting or model-output NetCDF for unexpected NaNs inside the computational domain, distinguishing genuine bugs from NaN that\u0026rsquo;s expected at open-boundary points for terms like advU/advV. See its own docstring — in short: python nc_nan_scan.py some_output.nc --vars advU,advV \\ --exclude-boundary-vars advU,advV --boundary-value 3,4 (boundary mask codes are model/file-specific — check the \u0026ldquo;values=\u0026rdquo; list the tool prints per mask; this NSe setup\u0026rsquo;s masku/maskv use 3 and 4 for boundary orientation, not the GETM-textbook single code 2, which only the T-mask maskt uses here.) 3. Known copies of nse_bdy_lonlat.txt — resolved 2026-08-17 As of 2026-08-03 there were four divergent copies of this file across three repos (NSe/, the oceanicu_3d repo root, boundaries (now boundaries.old), and ocean-prep), with most configs pointing at the wrong one — this section used to document that mess in detail. It\u0026rsquo;s now resolved:\nCanonical, single copy: NSe/Bathymetry/nse_bdy_lonlat.txt (moved from NSe/nse_bdy_lonlat.txt; still verified against getm-dump.nc, 0 points different). Every config (NSe/config/{nse_bdy_create,nse_init_create,nse_tidal_bdy}.yaml, and boundaries.old/config/{nse_bdy_create,nse_init_create}.yaml) references this one copy directly — a real absolute path in every case except NSe/config/nse_tidal_bdy.yaml, which uses a relative path resolved against cwd=NSe/ (see stage 2b). nse_bdy_create.yaml and nse_init_create.yaml moved here from ocean-prep/config/ on 2026-08-24 (NSe-specific configs belong with the NSe setup, not inside the generic ocean-prep tool repo). No symlinks anywhere — deliberate: this file changes per domain setup, not just NSe, so a shared symlink target wouldn\u0026rsquo;t generalize. The old oceanicu_3d/nse_bdy_lonlat.txt (repo-root, 309-point mis-landed edit — see §0\u0026rsquo;s \u0026ldquo;Update, 2026-08-17\u0026rdquo; note) is archived at NSe/Bathymetry/nse_bdy_lonlat.txt.mislanded_edit_20260803, not left at the repo root where it could be mistaken for a live copy again. If this ever drifts again: grep -rln nse_bdy_lonlat across OceanICU/oceanicu_3d, ocean-prep, and boundaries.old to find every reference, then verify each with ls -la (should show a real file at NSe/Bathymetry/nse_bdy_lonlat.txt and nothing else with that basename outside .bak*/archived copies) before trusting any of them.\nNSe North Sea/eastern Atlantic domain setup. This file is the entry point for \u0026ldquo;what do I run to (re)generate the inputs\u0026rdquo; — each topic below links to a deeper doc where one already exists. Expected to grow as more of the setup gets documented (river discharge, meteo, running the model itself, \u0026hellip;).\nBathymetry cd /home/kb/source/repos/OceanICU/oceanicu_3d/NSe ./generate_nse_bathymetry.py # full run (fixes applied by default), writes Bathymetry/bathymetry_nse.nc ./generate_nse_bathymetry.py --dryrun # print resolved config, write nothing ./generate_nse_bathymetry.py --no-fixes # skip --fixes-file/--accept-fixes ./generate_nse_bathymetry.py --extract-only # (re)run the ncks GEBCO extraction step only Behaviour (coarse source, depth/mask variable names, fixes:, mask_regions:, thalweg: waypoints, smooth.local_filters, smooth.local_rx0) is controlled by NSe/config/nse_bathymetry.yaml — edit that and re-run, no flags needed for config changes. Overwrites bathymetry_nse.nc in place, no automatic backup — copy it first if you want to diff against the previous version.\nAfter any regeneration, re-verify NSe/Bathymetry/nse_bdy_lonlat.txt against the new mask — a bathymetry fix can silently put boundary points on land with no error anywhere else. See BOUNDARY_GENERATION.md\u0026rsquo;s \u0026ldquo;§0 — read this first\u0026rdquo; for the check to run and why it matters.\nRuns fine on either orca or bb-server1 — no external data dependency beyond the local GEBCO source and ocean-prep\u0026rsquo;s bathymetry tooling.\nBoundaries Run on bb-server1, not orca (2026-08-24): the CMEMS/CMIP6/TPXO9 download caches these tools need (/data/cache/cmems, /data/cache/cmip6, /data/cache/tpxo9, plus the /data/CMIP6 and /data/TPXO9 source archives) live on bb-server1, not orca — orca\u0026rsquo;s copies were migrated over and removed. All output.base_directory paths below are bb-server1 absolute paths (/data/OceanICU/oceanicu_3d/data/NSe/...) accordingly.\nFull runbook: BOUNDARY_GENERATION.md (point-file provenance, the three-stage pipeline, post-generation sanity checks, known copies of nse_bdy_lonlat.txt). Short version:\n# Stage 1 — historical reference (CMEMS) cd /home/kb/source/repos/OceanICU/oceanicu_3d/NSe run-cmems-boundaries --config config/nse_bdy_create.yaml --dryrun run-cmems-boundaries --config config/nse_bdy_create.yaml # Stage 2a — future scenario, temperature/salinity (delta-change) cd /home/kb/source/repos/OceanICU/oceanicu_3d/NSe run-delta-boundaries --config config/nse_delta_bdy.yaml --dryrun run-delta-boundaries --config config/nse_delta_bdy.yaml --scenario ssp126 ssp370 ssp585 # Stage 2b — future scenario, SSH/currents (tidal + CMIP6) cd /home/kb/source/repos/OceanICU/oceanicu_3d/NSe run-tidal-boundaries --config config/nse_tidal_bdy.yaml --dryrun run-tidal-boundaries --config config/nse_tidal_bdy.yaml Stage 1 must exist before stage 2a can run (2a inherits its boundary-point layout from stage 1\u0026rsquo;s own NC files). Stage 2b is independent of stage 1.\nInitial conditions Run on bb-server1, not orca — same reason as boundaries above (CMEMS download cache lives there now).\nTwo source options — pick with --source; AMM7 is the default/primary (1993–2026-04-30 coverage), AMM15 covers 2024-03-01 onward:\ncd /home/kb/source/repos/OceanICU/oceanicu_3d/NSe download-init-conditions --config config/nse_init_create.yaml --source AMM7 download-init-conditions --config config/nse_init_create.yaml --source AMM15 download-init-conditions --config config/nse_init_create.yaml --source AMM7 --year 2015 download-init-conditions --config config/nse_init_create.yaml --source AMM7 --dryrun download-init-conditions --config config/nse_init_create.yaml --source AMM7 --check-coverage Downloads temperature/salinity on the source product\u0026rsquo;s native grid and writes 12 monthly snapshots (1st of each month) per variable to /data/OceanICU/oceanicu_3d/data/NSe/CMEMS/init/ (output.base_directory in config/nse_init_create.yaml). The NWS product (AMM7/AMM15) is primary and defines the output grid; the corresponding Baltic product fills the masked southern Kattegat/Belt Sea halo. flood_fill: true in the config also writes a {variable}_ff flood-filled variant of each field.\nModel config See config/README.md for how nse_from_oceanicu.yaml (the pygetm-config-schema domain config actually used to run the model) relates to nse_model_config.yaml, and driver/README.md for the driver itself (--print-config, --dump-python, data-path portability, the TUI editor).\nMore to follow River discharge, meteo forcing, and running the model itself aren\u0026rsquo;t documented here yet.\nNorth Sea Extension (NSe) Domain Description The NSe domain is a high-resolution regional configuration covering the northwest European shelf and the southern North Sea, from the English Channel in the south to the Norwegian coast in the north. It extends eastward into the Kattegat and the entrance to the Baltic Sea.\nGeographic Coverage Latitude: 47.5°N to 62.0°N Longitude: 8°W to 13°E Resolution: ~1/12° spherical grid (~7–9 km) Vertical: 40 generalised vertical coordinate (GVC) levels Key Features 9 open boundary segments, auto-detected from coordinate file (min gap 0.5°); segment 7 (eastern Kattegat) uses Baltic product override throughout because the NWS domain is masked in that region Bathymetry from GEBCO 2025 with Beckmann–Haidvogel smoothing (rx0 ≤ 0.2) and manual corrections for Belt Sea and Skagen straits Future climate projections use TPXO9 tidal forcing + CMIP6 mean-state correction (zos, uo, vo) plus a 3-D delta-change signal for temperature and salinity Observation Datasets Dataset Variables Period Type ICES hydrographic database Temperature, Salinity 1993– Cruise CTD / bottle ARGO floats (Ifremer/GDAC) Temperature, Salinity 2000– Autonomous profilers OSTIA / CMEMS SST Sea surface temperature 2003– Level 4 satellite analysis FES2014 / TPXO9 Tidal constituents — Barotropic tidal model Observations ARGO — 2010-2013 Station Map\nObservation Density\nCRUISE — 2010-2013 Station Map\nObservation Density\nICES — 2010-2013 Station Map\nObservation Density\nPSAL Hovmoller\nTEMP Hovmoller\nPLATFORM — 2010-2013 Station Map\nObservation Density\nCross-experiment Summary Surface How Input Files Were Generated Future ocean boundary conditions use CMIP6 model output as the climate-change signal on top of the historical CMEMS reference (AMM7/AMM15, same for all scenarios).\nScenario Summary GFDL-ESM4\nBoundary type SSP1-2.6 SSP3-7.0 Tidal mean state (2-D) zos\nuo/vo absent from ESGF — tidal only zos, uo, vo 3-D delta-change thetao, so\nuo/vo absent from ESGF — MPI-ESM1-2-HR\nBoundary type SSP3-7.0 3-D delta-change thetao, so, uo, vo Bathymetry Bathymetry Regridded conservatively from GEBCO 2025 onto the NSe ~1/12° spherical grid using bathymetry-regrid (ocean-prep), with Beckmann-Haidvogel smoothing (rx0 ≤ 0.2) and manual depth fixes for Belt Sea straits and Skagen. Output: bathymetry_nse.nc with variables lon, lat, mask, H.\nNSe bathymetry config\nConfig not yet committed — will be added once NSe grid parameters are finalised.\nbathymetry-regrid --config config/nse_bathy_create.yaml Boundary Conditions CMEMS historical boundaries (T, S, SSH, currents) AMM7 NWS MY reanalysis (1993–2026-04-30) blended with AMM15 NWS ANFC (2026-05-01 onwards). Segment 7 (eastern Kattegat) overridden with Baltic products for all variables; SSH uses Baltic detided product from 2022-12-02. Processed with ocean-prep run_cmems_boundaries.\nNSe CMEMS boundary config\npython cli/run_cmems_boundaries.py --config config/nse_bdy_create.yaml Tidal boundaries (TPXO9 + CMIP6 mean SSH / barotropic transport) TPXO9-atlas (13 constituents) tidal prediction for zos, uo, vo combined with CMIP6 monthly mean sea-surface height and depth-integrated barotropic transport. Scenario-specific; see Scenario Summary table below.\nNSe tidal boundary config\nrun-tidal-boundaries --config config/nse_tidal_bdy.yaml 3-D delta-change boundaries (T, S and optionally currents) Future 3-D boundary conditions via the delta-change method: AMM7/AMM15 historical CMEMS reference cycled over the output period, with a CMIP6 monthly change signal (future 20-yr climatology minus historical 1985–2014 climatology) added at each boundary point. Scenario-specific; see Scenario Summary table below.\nNSe delta-change boundary config\nrun-delta-boundaries --config config/nse_delta_bdy.yaml --scenario ssp126 Initial Conditions Initial conditions (temperature, salinity) Monthly snapshots (1st of each month) from CMEMS NWS products — AMM7 MY reanalysis or AMM15 ANFC — with the Baltic ANFC product filling the southern Kattegat masked halo. Flood-fill propagates valid values into any remaining NaN cells on the model grid.\nNSe initial conditions config\npython cli/download_init_conditions.py --config config/nse_init_create.yaml --source AMM7 --year 2015 ","permalink":"https://bolding-bruggeman.com/oceanicu_3d/areas/nse/","summary":"NSe modeling area — validation results and experiment overview.","title":"NSe"},{"content":"Harmonic analysis of sea surface elevation compared with satellite products and tide gauge observations.\nAnalysis Summary Analyzed Constituents: K1, K2, M2, N2, O1, P1, Q1, S2\nAnalysis Date: 2026-10-10 Satellite Product: FES2014/TPXO9\nPlots Tide Gauge Station Map GESLA tide gauge station locations\nYear 2011 K₁ (lunar-solar diurnal) — model amplitude and phase\nK₁ (lunar-solar diurnal) — amplitude/phase comparison with GESLA tide gauges\nO₁ (principal lunar diurnal) — model amplitude and phase\nO₁ (principal lunar diurnal) — amplitude/phase comparison with GESLA tide gauges\nP₁ (principal solar diurnal) — model amplitude and phase\nP₁ (principal solar diurnal) — amplitude/phase comparison with GESLA tide gauges\nQ₁ (larger lunar elliptic diurnal) — model amplitude and phase\nQ₁ (larger lunar elliptic diurnal) — amplitude/phase comparison with GESLA tide gauges\nK₂ (lunar-solar semi-diurnal) — model amplitude and phase\nK₂ (lunar-solar semi-diurnal) — amplitude/phase comparison with GESLA tide gauges\nM₂ (principal lunar semi-diurnal) — model amplitude and phase\nM₂ (principal lunar semi-diurnal) — amplitude/phase comparison with GESLA tide gauges\nN₂ (larger lunar elliptic semi-diurnal) — model amplitude and phase\nN₂ (larger lunar elliptic semi-diurnal) — amplitude/phase comparison with GESLA tide gauges\nS₂ (principal solar semi-diurnal) — model amplitude and phase\nS₂ (principal solar semi-diurnal) — amplitude/phase comparison with GESLA tide gauges\nStation amplitude/phase comparison — diurnal constituents\nStation amplitude/phase comparison — semi-diurnal constituents\nTide Gauge Station Comparison Compared with 89 tide gauge stations.\nStation Results (Sample) station lat lon country years_of_obs constituent model_amp obs_amp amp_diff model_pha obs_pha pha_diff roscoff-54-fra-refmar 48.718 -3.966 FRA 53.000 M2 1.673 2.695 -1.022 164.480 142.046 22.433 roscoff-54-fra-refmar 48.718 -3.966 FRA 53.000 S2 0.593 1.005 -0.412 -149.207 -172.254 23.047 roscoff-54-fra-refmar 48.718 -3.966 FRA 53.000 N2 0.336 0.533 -0.197 145.097 123.796 21.301 roscoff-54-fra-refmar 48.718 -3.966 FRA 53.000 K2 0.159 0.287 -0.128 -151.167 -174.564 23.396 roscoff-54-fra-refmar 48.718 -3.966 FRA 53.000 K1 0.070 0.082 -0.013 107.919 82.046 25.873 roscoff-54-fra-refmar 48.718 -3.966 FRA 53.000 O1 0.052 0.073 -0.021 -5.393 -28.193 22.800 roscoff-54-fra-refmar 48.718 -3.966 FRA 53.000 P1 0.022 0.028 -0.005 106.514 72.698 33.816 roscoff-54-fra-refmar 48.718 -3.966 FRA 53.000 Q1 0.023 0.022 0.001 -50.882 -72.558 21.676 saint_malo-410-fra-refmar 48.641 -2.028 FRA 35.000 M2 2.311 3.674 -1.363 -163.028 177.534 19.439 saint_malo-410-fra-refmar 48.641 -2.028 FRA 35.000 S2 0.867 1.434 -0.568 -112.947 -132.090 19.143 saint_malo-410-fra-refmar 48.641 -2.028 FRA 35.000 N2 0.459 0.717 -0.257 178.830 161.366 17.465 saint_malo-410-fra-refmar 48.641 -2.028 FRA 35.000 K2 0.231 0.410 -0.180 -114.576 -134.593 20.016 saint_malo-410-fra-refmar 48.641 -2.028 FRA 35.000 K1 0.084 0.095 -0.011 121.084 95.529 25.555 saint_malo-410-fra-refmar 48.641 -2.028 FRA 35.000 O1 0.061 0.082 -0.021 7.140 -15.478 22.618 saint_malo-410-fra-refmar 48.641 -2.028 FRA 35.000 P1 0.029 0.035 -0.005 120.998 87.756 33.242 saint_malo-410-fra-refmar 48.641 -2.028 FRA 35.000 Q1 0.025 0.024 0.001 -35.705 -57.656 21.951 st_marys-stm-gbr-da_idh 49.918 -6.317 GBR 9.000 M2 1.056 1.758 -0.703 152.912 131.222 21.690 st_marys-stm-gbr-da_idh 49.918 -6.317 GBR 9.000 S2 0.331 0.603 -0.272 -164.243 172.192 23.565 st_marys-stm-gbr-da_idh 49.918 -6.317 GBR 9.000 N2 0.210 0.344 -0.134 131.603 111.930 19.673 st_marys-stm-gbr-da_idh 49.918 -6.317 GBR 9.000 K2 0.090 0.172 -0.082 -166.040 169.735 24.226 Download Full Table\nMethodology Harmonic Analysis Tidal constituents extracted using UTide harmonic analysis package. Analysis performed on high-frequency model output (10-15 min resolution) over a minimum period of 60 days.\nSatellite Comparison Model results compared with satellite-derived tidal products:\nFES2014: Finite Element Solution 2014 (1/16° resolution) TPXO9: OSU Tidal Prediction Software (1/30° resolution) Satellite data regridded to model grid using conservative interpolation.\n← Back to NSe\n","permalink":"https://bolding-bruggeman.com/oceanicu_3d/validations/nse-cmems-tidal/","summary":"\u003cp\u003eHarmonic analysis of sea surface elevation compared with satellite products and tide gauge observations.\u003c/p\u003e\n\u003ch2 id=\"analysis-summary\"\u003eAnalysis Summary\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eAnalyzed Constituents\u003c/strong\u003e: K1, K2, M2, N2, O1, P1, Q1, S2\u003cbr\u003e\n\u003cstrong\u003eAnalysis Date\u003c/strong\u003e: 2026-10-10\n\u003cstrong\u003eSatellite Product\u003c/strong\u003e: FES2014/TPXO9\u003c/p\u003e\n\u003ch2 id=\"plots\"\u003ePlots\u003c/h2\u003e\n\u003ch3 id=\"tide-gauge-station-map\"\u003eTide Gauge Station Map\u003c/h3\u003e\n\u003cp\u003e\u003cimg alt=\"GESLA tide gauge station locations\" loading=\"lazy\" src=\"/validation-data/nse-cmems-tidal/physics/pyGETM/2011/tidal/gesla_station_map.png\"\u003e\n\u003cem\u003eGESLA tide gauge station locations\u003c/em\u003e\u003c/p\u003e\n\u003ch3 id=\"year-2011\"\u003eYear 2011\u003c/h3\u003e\n\u003cp\u003e\u003cimg alt=\"K₁ (lunar-solar diurnal) — model amplitude and phase\" loading=\"lazy\" src=\"/validation-data/nse-cmems-tidal/physics/pyGETM/2011/tidal/K1_model_amp_phase.png\"\u003e\n\u003cem\u003eK₁ (lunar-solar diurnal) — model amplitude and phase\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg alt=\"K₁ (lunar-solar diurnal) — amplitude/phase comparison with GESLA tide gauges\" loading=\"lazy\" src=\"/validation-data/nse-cmems-tidal/physics/pyGETM/2011/tidal/K1_gesla_comparison.png\"\u003e\n\u003cem\u003eK₁ (lunar-solar diurnal) — amplitude/phase comparison with GESLA tide gauges\u003c/em\u003e\u003c/p\u003e","title":"NSe - CMEMS/tidal - Tidal Analysis"},{"content":"Harmonic analysis of sea surface elevation compared with satellite products and tide gauge observations.\nAnalysis Summary Analyzed Constituents: K1, K2, M2, N2, O1, P1, Q1, S2\nAnalysis Date: 2026-10-10 Satellite Product: FES2014/TPXO9\nPlots Tide Gauge Station Map GESLA tide gauge station locations\nK₁ (lunar-solar diurnal) — model amplitude and phase\nK₁ (lunar-solar diurnal) — amplitude/phase comparison with GESLA tide gauges\nO₁ (principal lunar diurnal) — model amplitude and phase\nO₁ (principal lunar diurnal) — amplitude/phase comparison with GESLA tide gauges\nP₁ (principal solar diurnal) — model amplitude and phase\nP₁ (principal solar diurnal) — amplitude/phase comparison with GESLA tide gauges\nQ₁ (larger lunar elliptic diurnal) — model amplitude and phase\nQ₁ (larger lunar elliptic diurnal) — amplitude/phase comparison with GESLA tide gauges\nK₂ (lunar-solar semi-diurnal) — model amplitude and phase\nK₂ (lunar-solar semi-diurnal) — amplitude/phase comparison with GESLA tide gauges\nM₂ (principal lunar semi-diurnal) — model amplitude and phase\nM₂ (principal lunar semi-diurnal) — amplitude/phase comparison with GESLA tide gauges\nN₂ (larger lunar elliptic semi-diurnal) — model amplitude and phase\nN₂ (larger lunar elliptic semi-diurnal) — amplitude/phase comparison with GESLA tide gauges\nS₂ (principal solar semi-diurnal) — model amplitude and phase\nS₂ (principal solar semi-diurnal) — amplitude/phase comparison with GESLA tide gauges\nStation amplitude/phase comparison — diurnal constituents\nStation amplitude/phase comparison — semi-diurnal constituents\nTide Gauge Station Comparison Compared with 89 tide gauge stations.\nStation Results (Sample) station lat lon country years_of_obs constituent model_amp obs_amp amp_diff model_pha obs_pha pha_diff roscoff-54-fra-refmar 48.718 -3.966 FRA 53.000 M2 2.578 2.695 -0.117 -117.861 142.046 100.093 roscoff-54-fra-refmar 48.718 -3.966 FRA 53.000 S2 0.977 1.005 -0.027 -171.773 -172.254 0.480 roscoff-54-fra-refmar 48.718 -3.966 FRA 53.000 N2 0.515 0.533 -0.018 -41.587 123.796 -165.383 roscoff-54-fra-refmar 48.718 -3.966 FRA 53.000 K2 0.279 0.287 -0.008 -43.947 -174.564 130.616 roscoff-54-fra-refmar 48.718 -3.966 FRA 53.000 K1 0.087 0.082 0.005 66.250 82.046 -15.796 roscoff-54-fra-refmar 48.718 -3.966 FRA 53.000 O1 0.065 0.073 -0.008 95.083 -28.193 123.276 roscoff-54-fra-refmar 48.718 -3.966 FRA 53.000 P1 0.029 0.028 0.001 116.583 72.698 43.885 roscoff-54-fra-refmar 48.718 -3.966 FRA 53.000 Q1 0.020 0.022 -0.002 139.300 -72.558 -148.141 saint_malo-410-fra-refmar 48.641 -2.028 FRA 35.000 M2 3.554 3.674 -0.119 -81.421 177.534 101.045 saint_malo-410-fra-refmar 48.641 -2.028 FRA 35.000 S2 1.383 1.434 -0.051 -129.993 -132.090 2.098 saint_malo-410-fra-refmar 48.641 -2.028 FRA 35.000 N2 0.698 0.717 -0.018 -1.635 161.366 -163.000 saint_malo-410-fra-refmar 48.641 -2.028 FRA 35.000 K2 0.400 0.410 -0.010 -1.941 -134.593 132.652 saint_malo-410-fra-refmar 48.641 -2.028 FRA 35.000 K1 0.103 0.095 0.009 82.028 95.529 -13.501 saint_malo-410-fra-refmar 48.641 -2.028 FRA 35.000 O1 0.073 0.082 -0.009 109.270 -15.478 124.748 saint_malo-410-fra-refmar 48.641 -2.028 FRA 35.000 P1 0.034 0.035 -0.001 133.148 87.756 45.392 saint_malo-410-fra-refmar 48.641 -2.028 FRA 35.000 Q1 0.022 0.024 -0.003 155.483 -57.656 -146.861 st_marys-stm-gbr-da_idh 49.918 -6.317 GBR 9.000 M2 1.650 1.758 -0.108 -129.974 131.222 98.805 st_marys-stm-gbr-da_idh 49.918 -6.317 GBR 9.000 S2 0.580 0.603 -0.023 172.489 172.192 0.297 st_marys-stm-gbr-da_idh 49.918 -6.317 GBR 9.000 N2 0.316 0.344 -0.028 -56.343 111.930 -168.273 st_marys-stm-gbr-da_idh 49.918 -6.317 GBR 9.000 K2 0.166 0.172 -0.006 -59.830 169.735 130.435 Download Full Table\nMethodology Harmonic Analysis Tidal constituents extracted using UTide harmonic analysis package. Analysis performed on high-frequency model output (10-15 min resolution) over a minimum period of 60 days.\nSatellite Comparison Model results compared with satellite-derived tidal products:\nFES2014: Finite Element Solution 2014 (1/16° resolution) TPXO9: OSU Tidal Prediction Software (1/30° resolution) Satellite data regridded to model grid using conservative interpolation.\n← Back to NSe\n","permalink":"https://bolding-bruggeman.com/oceanicu_3d/validations/nse-cmip6-tidal/","summary":"\u003cp\u003eHarmonic analysis of sea surface elevation compared with satellite products and tide gauge observations.\u003c/p\u003e\n\u003ch2 id=\"analysis-summary\"\u003eAnalysis Summary\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eAnalyzed Constituents\u003c/strong\u003e: K1, K2, M2, N2, O1, P1, Q1, S2\u003cbr\u003e\n\u003cstrong\u003eAnalysis Date\u003c/strong\u003e: 2026-10-10\n\u003cstrong\u003eSatellite Product\u003c/strong\u003e: FES2014/TPXO9\u003c/p\u003e\n\u003ch2 id=\"plots\"\u003ePlots\u003c/h2\u003e\n\u003ch3 id=\"tide-gauge-station-map\"\u003eTide Gauge Station Map\u003c/h3\u003e\n\u003cp\u003e\u003cimg alt=\"GESLA tide gauge station locations\" loading=\"lazy\" src=\"/validation-data/nse-cmip6-tidal/physics/pyGETM/2011-2011/tidal/gesla_station_map.png\"\u003e\n\u003cem\u003eGESLA tide gauge station locations\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg alt=\"K₁ (lunar-solar diurnal) — model amplitude and phase\" loading=\"lazy\" src=\"/validation-data/nse-cmip6-tidal/physics/pyGETM/2011-2011/tidal/K1_model_amp_phase.png\"\u003e\n\u003cem\u003eK₁ (lunar-solar diurnal) — model amplitude and phase\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg alt=\"K₁ (lunar-solar diurnal) — amplitude/phase comparison with GESLA tide gauges\" loading=\"lazy\" src=\"/validation-data/nse-cmip6-tidal/physics/pyGETM/2011-2011/tidal/K1_gesla_comparison.png\"\u003e\n\u003cem\u003eK₁ (lunar-solar diurnal) — amplitude/phase comparison with GESLA tide gauges\u003c/em\u003e\u003c/p\u003e","title":"NSe - CMIP6/tidal - Tidal Analysis"},{"content":"Horizontal Validation results comparing model output against observations.\nExperiment Information Area: NSe Experiment: CMEMS/spinup Validation Type: Horizontal Validation Variables: TEMP_SURFACE\nOverview Metric TEMP_SURFACE / OSTIA RMSE 1.1152 Bias 0.5067 Corr 0.9031 N points 10,685,740 Horizontal Validation Statistics TEMP_SURFACE Metric OSTIA RMSE 1.1152 Bias +0.5067 MAE 0.8360 Corr 0.9031 Model mean 11.3317 Obs mean 10.8250 View Full Statistics Report ################################################################################ TEMP_SURFACE Validation Statistics ################################################################################ Format: 1.1 Created: 2026-10-07 11:11:45 Author: K.B. \u0026amp; R.T. Project: OceanICU Institute: BB Area: NSe Experiment: CMEMS/spinup ################################################################################ ================================================================================ Period: 2011-2013 | Model: pyGETM ================================================================================ Analysed: 2026-10-07 13:59:52 --- OSTIA --- RMSE: 1.1152 Bias: +0.5067 MAE: 0.8360 Correlation: 0.9031 N points: 10,685,740 Model mean: 11.3317 Obs mean: 10.8250 Model std: 3.9211 Obs std: 3.8866 Error distribution: Min: -7.8229 5th pct: -0.8018 25th pct: -0.0160 Median: +0.4534 75th pct: +0.8926 95th pct: +1.7141 Max: +8.4514 Monthly breakdown: Month RMSE Bias MAE Corr -------------------------------------------- Jan 1.9842 +1.6141 1.6611 0.8909 Feb 1.0789 +0.7273 0.8487 0.9342 Mar 0.8300 +0.4440 0.5908 0.9489 Apr 0.7977 +0.3366 0.5978 0.9336 May 0.9001 +0.4658 0.7189 0.8604 Jun 1.3635 +1.0185 1.1503 0.8592 Jul 1.4952 +1.1272 1.2696 0.8166 Aug 1.2142 +0.8638 1.0129 0.8698 Sep 0.7362 +0.2231 0.5553 0.9152 Oct 0.6620 -0.1049 0.4921 0.9460 Nov 0.6538 -0.1955 0.4983 0.9331 Dec 0.8082 -0.4389 0.6194 0.9291 -------------------------------------------- All 1.1152 +0.5067 0.8360 0.9031 ================================================================================ Period: 2011 | Model: pyGETM ================================================================================ Analysed: 2026-10-07 13:59:52 --- OSTIA --- RMSE: 1.1152 Bias: +0.5067 MAE: 0.8360 Correlation: 0.9031 N points: 10,685,740 Model mean: 11.3317 Obs mean: 10.8250 Model std: 3.9211 Obs std: 3.8866 Error distribution: Min: -7.8229 5th pct: -0.8018 25th pct: -0.0160 Median: +0.4534 75th pct: +0.8926 95th pct: +1.7141 Max: +8.4514 📄 Download Statistics Report (txt) · 📄 YAML\nPlots Full Period TEMP_SURFACE Temperature (surface) — monthly by year\nTemperature (surface) — monthly statistics\nOSTIA Temperature (surface) — OSTIA comparison\nTemperature (surface) — OSTIA monthly maps\nTemperature (surface) — OSTIA monthly taylor\nTemperature (surface) — OSTIA pdf annual\nTemperature (surface) — OSTIA pdf monthly\nTemperature (surface) — OSTIA spatial stats\nTaylor diagram\nObservations ARGO Observations — 2010-2013 ARGO Station Map\nARGO Observation Density\nCRUISE Observations — 2010-2013 CRUISE Station Map\nCRUISE Observation Density\nICES Observations — 2010-2013 ICES Station Map\nICES Observation Density\nICES PSAL Hovmoller\nICES TEMP Hovmoller\nPLATFORM Observations — 2010-2013 PLATFORM Station Map\nPLATFORM Observation Density\nMethodology Horizontal Validation Model surface fields compared against gridded satellite products and in-situ observations.\nStatistics: RMSE, Bias, MAE, Pearson correlation.\nSpatial statistics show the error distribution across the domain.\n← Back to NSe View All Validations →\n","permalink":"https://bolding-bruggeman.com/oceanicu_3d/validations/nse-cmems-spinup/","summary":"\u003cp\u003eHorizontal Validation results comparing model output against observations.\u003c/p\u003e\n\u003ch2 id=\"experiment-information\"\u003eExperiment Information\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eArea\u003c/strong\u003e: NSe\n\u003cstrong\u003eExperiment\u003c/strong\u003e: CMEMS/spinup\n\u003cstrong\u003eValidation Type\u003c/strong\u003e: Horizontal Validation\n\u003cstrong\u003eVariables\u003c/strong\u003e: TEMP_SURFACE\u003c/p\u003e\n\u003ch2 id=\"overview\"\u003eOverview\u003c/h2\u003e\n\u003ctable\u003e\n  \u003cthead\u003e\n      \u003ctr\u003e\n          \u003cth\u003eMetric\u003c/th\u003e\n          \u003cth\u003eTEMP_SURFACE / OSTIA\u003c/th\u003e\n      \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eRMSE\u003c/td\u003e\n          \u003ctd\u003e1.1152\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eBias\u003c/td\u003e\n          \u003ctd\u003e0.5067\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eCorr\u003c/td\u003e\n          \u003ctd\u003e0.9031\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eN points\u003c/td\u003e\n          \u003ctd\u003e10,685,740\u003c/td\u003e\n      \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch2 id=\"horizontal-validation\"\u003eHorizontal Validation\u003c/h2\u003e\n\u003ch3 id=\"statistics\"\u003eStatistics\u003c/h3\u003e\n\u003ch3 id=\"temp_surface\"\u003eTEMP_SURFACE\u003c/h3\u003e\n\u003ctable\u003e\n  \u003cthead\u003e\n      \u003ctr\u003e\n          \u003cth\u003eMetric\u003c/th\u003e\n          \u003cth\u003eOSTIA\u003c/th\u003e\n      \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eRMSE\u003c/td\u003e\n          \u003ctd\u003e1.1152\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eBias\u003c/td\u003e\n          \u003ctd\u003e+0.5067\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eMAE\u003c/td\u003e\n          \u003ctd\u003e0.8360\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eCorr\u003c/td\u003e\n          \u003ctd\u003e0.9031\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eModel mean\u003c/td\u003e\n          \u003ctd\u003e11.3317\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eObs mean\u003c/td\u003e\n          \u003ctd\u003e10.8250\u003c/td\u003e\n      \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\u003cdetails\u003e\n\u003csummary\u003eView Full Statistics Report\u003c/summary\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e################################################################################\nTEMP_SURFACE Validation Statistics\n################################################################################\n  Format:     1.1\n  Created:    2026-10-07 11:11:45\n  Author:       K.B. \u0026amp; R.T.\n  Project:      OceanICU\n  Institute:    BB\n  Area:         NSe\n  Experiment:   CMEMS/spinup\n################################################################################\n\n================================================================================\nPeriod: 2011-2013  |  Model: pyGETM\n================================================================================\nAnalysed: 2026-10-07  13:59:52\n\n--- OSTIA ---\n  RMSE:          1.1152\n  Bias:         +0.5067\n  MAE:           0.8360\n  Correlation:   0.9031\n  N points:      10,685,740\n  Model mean:   11.3317\n  Obs mean:     10.8250\n  Model std:    3.9211\n  Obs std:      3.8866\n\n  Error distribution:\n    Min:         -7.8229\n    5th pct:      -0.8018\n    25th pct:     -0.0160\n    Median:       +0.4534\n    75th pct:     +0.8926\n    95th pct:     +1.7141\n    Max:         +8.4514\n\n  Monthly breakdown:\n  Month      RMSE      Bias      MAE    Corr\n  --------------------------------------------\n  Jan      1.9842   +1.6141   1.6611  0.8909\n  Feb      1.0789   +0.7273   0.8487  0.9342\n  Mar      0.8300   +0.4440   0.5908  0.9489\n  Apr      0.7977   +0.3366   0.5978  0.9336\n  May      0.9001   +0.4658   0.7189  0.8604\n  Jun      1.3635   +1.0185   1.1503  0.8592\n  Jul      1.4952   +1.1272   1.2696  0.8166\n  Aug      1.2142   +0.8638   1.0129  0.8698\n  Sep      0.7362   +0.2231   0.5553  0.9152\n  Oct      0.6620   -0.1049   0.4921  0.9460\n  Nov      0.6538   -0.1955   0.4983  0.9331\n  Dec      0.8082   -0.4389   0.6194  0.9291\n  --------------------------------------------\n  All      1.1152   +0.5067   0.8360  0.9031\n\n================================================================================\nPeriod: 2011  |  Model: pyGETM\n================================================================================\nAnalysed: 2026-10-07  13:59:52\n\n--- OSTIA ---\n  RMSE:          1.1152\n  Bias:         +0.5067\n  MAE:           0.8360\n  Correlation:   0.9031\n  N points:      10,685,740\n  Model mean:   11.3317\n  Obs mean:     10.8250\n  Model std:    3.9211\n  Obs std:      3.8866\n\n  Error distribution:\n    Min:         -7.8229\n    5th pct:      -0.8018\n    25th pct:     -0.0160\n    Median:       +0.4534\n    75th pct:     +0.8926\n    95th pct:     +1.7141\n    Max:         +8.4514\n\u003c/code\u003e\u003c/pre\u003e\u003c/details\u003e\n\u003cp\u003e\u003ca href=\"/validation-data/nse-cmems-spinup/temp_surface_validation_statistics.txt\"\u003e📄 Download Statistics Report (txt)\u003c/a\u003e · \u003ca href=\"/validation-data/nse-cmems-spinup/temp_surface_validation_statistics.yaml\"\u003e📄 YAML\u003c/a\u003e\u003c/p\u003e","title":"NSe - Experiment CMEMS/spinup"},{"content":"Horizontal Validation results comparing model output against observations.\nExperiment Information Area: NSe Experiment: CMEMS/v01P Validation Type: Horizontal Validation Variables: SALT_BOTTOM, TEMP_BOTTOM, SALT_SURFACE, TEMP_SURFACE Period: 2010–2013\nOverview Metric SALT_BOTTOM / NWS-salinity TEMP_BOTTOM / NWS-bottomT SALT_SURFACE / CCI-SSS TEMP_SURFACE / OSTIA TEMP_SURFACE / CCI-SST TEMP_SURFACE / OISST RMSE 0.6971 1.4277 3.3841 1.0235 1.0134 1.0914 Bias -0.3027 -0.5865 -1.5321 0.0815 0.1903 0.1890 Corr 0.8896 0.9169 0.8908 0.9080 0.9145 0.9076 N points 1,265,376 1,265,376 40,069,386 42,772,236 43,019,271 39,162,105 Horizontal Validation Statistics SALT_BOTTOM Metric NWS-salinity RMSE 0.6971 Bias -0.3027 MAE 0.3791 Corr 0.8896 Model mean 34.4084 Obs mean 34.7111 View Full Statistics Report ################################################################################ SALT_BOTTOM Validation Statistics ################################################################################ Format: 1.1 Created: 2026-10-08 20:11:59 Area: NSe Experiment: CMEMS/v01P ################################################################################ ================================================================================ Period: 2010-2013 | Model: pyGETM ================================================================================ Analysed: 2026-10-08 20:37:04 --- NWS-salinity --- RMSE: 0.6971 Bias: -0.3027 MAE: 0.3791 Correlation: 0.8896 N points: 1,265,376 Model mean: 34.4084 Obs mean: 34.7111 Model std: 1.3446 Obs std: 1.0655 Error distribution: Min: -16.5796 5th pct: -1.3642 25th pct: -0.4245 Median: -0.1510 75th pct: -0.0028 95th pct: +0.1602 Max: +8.8929 Monthly breakdown: Month RMSE Bias MAE Corr -------------------------------------------- Jan 0.6379 -0.2419 0.3419 0.8927 Feb 0.6361 -0.2803 0.3705 0.8950 Mar 0.6865 -0.3041 0.3890 0.8826 Apr 0.6773 -0.3120 0.3933 0.8913 May 0.6346 -0.2988 0.3775 0.8943 Jun 0.6936 -0.3041 0.3820 0.8910 Jul 0.7101 -0.3066 0.3834 0.8920 Aug 0.7107 -0.3183 0.3826 0.9039 Sep 0.7717 -0.3353 0.3948 0.8947 Oct 0.7382 -0.3199 0.3808 0.8991 Nov 0.7186 -0.3003 0.3734 0.8872 Dec 0.7350 -0.3107 0.3800 0.8810 -------------------------------------------- All 0.6971 -0.3027 0.3791 0.8896 ================================================================================ Period: 2010 | Model: pyGETM ================================================================================ Analysed: 2026-10-08 20:37:04 --- NWS-salinity --- RMSE: 0.5176 Bias: -0.2093 MAE: 0.2886 Correlation: 0.9186 N points: 316,344 Model mean: 34.4712 Obs mean: 34.6805 Model std: 1.1958 Obs std: 1.0703 Error distribution: Min: -13.2630 5th pct: -0.9487 25th pct: -0.3140 Median: -0.1237 75th pct: -0.0010 95th pct: +0.1504 Max: +6.7311 ================================================================================ Period: 2011 | Model: pyGETM ================================================================================ Analysed: 2026-10-08 20:37:04 --- NWS-salinity --- RMSE: 0.7867 Bias: -0.3657 MAE: 0.4295 Correlation: 0.8890 N points: 316,344 Model mean: 34.3441 Obs mean: 34.7098 Model std: 1.4523 Obs std: 1.0837 Error distribution: Min: -14.9381 5th pct: -1.7103 25th pct: -0.4376 Median: -0.1632 75th pct: -0.0159 95th pct: +0.1437 Max: +8.4983 ================================================================================ Period: 2012 | Model: pyGETM ================================================================================ Analysed: 2026-10-08 20:37:04 --- NWS-salinity --- RMSE: 0.7846 Bias: -0.3346 MAE: 0.4079 Correlation: 0.8806 N points: 316,344 Model mean: 34.4468 Obs mean: 34.7814 Model std: 1.4133 Obs std: 1.0098 Error distribution: Min: -16.5796 5th pct: -1.6229 25th pct: -0.4299 Median: -0.1581 75th pct: -0.0037 95th pct: +0.1572 Max: +8.8929 ================================================================================ Period: 2013 | Model: pyGETM ================================================================================ Analysed: 2026-10-08 20:37:04 --- NWS-salinity --- RMSE: 0.6646 Bias: -0.3012 MAE: 0.3905 Correlation: 0.8912 N points: 316,344 Model mean: 34.3717 Obs mean: 34.6729 Model std: 1.2980 Obs std: 1.0928 Error distribution: Min: -12.5484 5th pct: -1.2125 25th pct: -0.4990 Median: -0.1618 75th pct: +0.0028 95th pct: +0.1810 Max: +7.1086 📄 Download Statistics Report (txt) · 📄 YAML\nTEMP_BOTTOM Metric NWS-bottomT RMSE 1.4277 Bias -0.5865 MAE 0.9517 Corr 0.9169 Model mean 8.5984 Obs mean 9.1850 View Full Statistics Report ################################################################################ TEMP_BOTTOM Validation Statistics ################################################################################ Format: 1.1 Created: 2026-10-08 20:11:12 Area: NSe Experiment: CMEMS/v01P ################################################################################ ================================================================================ Period: 2010-2013 | Model: pyGETM ================================================================================ Analysed: 2026-10-08 20:33:46 --- NWS-bottomT --- RMSE: 1.4277 Bias: -0.5865 MAE: 0.9517 Correlation: 0.9169 N points: 1,265,376 Model mean: 8.5984 Obs mean: 9.1850 Model std: 3.1628 Obs std: 3.2439 Error distribution: Min: -11.2410 5th pct: -3.1440 25th pct: -1.1726 Median: -0.2676 75th pct: +0.2105 95th pct: +0.9777 Max: +5.9366 Monthly breakdown: Month RMSE Bias MAE Corr -------------------------------------------- Jan 0.7159 +0.1706 0.5324 0.9130 Feb 0.5771 +0.1029 0.4297 0.9470 Mar 0.5847 +0.0848 0.3999 0.9417 Apr 0.6320 -0.1495 0.4562 0.9234 May 0.9545 -0.5222 0.7241 0.9085 Jun 1.5279 -0.9084 1.1396 0.8991 Jul 1.9929 -1.1814 1.4708 0.9034 Aug 2.2438 -1.3304 1.6514 0.9075 Sep 2.1359 -1.2724 1.5834 0.9075 Oct 1.8090 -1.0630 1.3449 0.9028 Nov 1.4044 -0.7317 1.0323 0.8766 Dec 0.9022 -0.2377 0.6558 0.8639 -------------------------------------------- All 1.4277 -0.5865 0.9517 0.9169 ================================================================================ Period: 2010 | Model: pyGETM ================================================================================ Analysed: 2026-10-08 20:33:46 --- NWS-bottomT --- RMSE: 1.4419 Bias: -0.4748 MAE: 0.9386 Correlation: 0.9092 N points: 316,344 Model mean: 8.4897 Obs mean: 8.9645 Model std: 3.0328 Obs std: 3.2670 Error distribution: Min: -10.9919 5th pct: -3.1673 25th pct: -0.9650 Median: -0.1296 75th pct: +0.3225 95th pct: +1.1342 Max: +5.2094 ================================================================================ Period: 2011 | Model: pyGETM ================================================================================ Analysed: 2026-10-08 20:33:46 --- NWS-bottomT --- RMSE: 1.5486 Bias: -0.7525 MAE: 1.0344 Correlation: 0.9169 N points: 316,344 Model mean: 8.7259 Obs mean: 9.4784 Model std: 3.3399 Obs std: 3.2960 Error distribution: Min: -11.2410 5th pct: -3.3827 25th pct: -1.3560 Median: -0.3896 75th pct: +0.1057 95th pct: +0.7945 Max: +4.6146 ================================================================================ Period: 2012 | Model: pyGETM ================================================================================ Analysed: 2026-10-08 20:33:46 --- NWS-bottomT --- RMSE: 1.2734 Bias: -0.5912 MAE: 0.8600 Correlation: 0.9279 N points: 316,344 Model mean: 8.9602 Obs mean: 9.5515 Model std: 2.9900 Obs std: 2.9447 Error distribution: Min: -10.0477 5th pct: -2.7068 25th pct: -1.0837 Median: -0.3445 75th pct: +0.0937 95th pct: +0.7879 Max: +3.8610 ================================================================================ Period: 2013 | Model: pyGETM ================================================================================ Analysed: 2026-10-08 20:33:46 --- NWS-bottomT --- RMSE: 1.4333 Bias: -0.5276 MAE: 0.9739 Correlation: 0.9197 N points: 316,344 Model mean: 8.2179 Obs mean: 8.7455 Model std: 3.2277 Obs std: 3.3796 Error distribution: Min: -10.1839 5th pct: -3.1710 25th pct: -1.1555 Median: -0.1833 75th pct: +0.2813 95th pct: +1.0903 Max: +5.9366 📄 Download Statistics Report (txt) · 📄 YAML\nSALT_SURFACE Metric CCI-SSS RMSE 3.3841 Bias -1.5321 MAE 1.7551 Corr 0.8908 Model mean 32.1779 Obs mean 33.7100 View Full Statistics Report ################################################################################ SALT_SURFACE Validation Statistics ################################################################################ Format: 1.1 Created: 2026-10-08 19:59:28 Area: NSe Experiment: CMEMS/v01P ################################################################################ ================================================================================ Period: 2010-2013 | Model: pyGETM ================================================================================ Analysed: 2026-10-08 19:59:28 --- CCI-SSS --- RMSE: 3.3841 Bias: -1.5321 MAE: 1.7551 Correlation: 0.8908 N points: 40,069,386 Model mean: 32.1779 Obs mean: 33.7100 Model std: 5.1653 Obs std: 2.7759 Error distribution: Min: -33.1818 5th pct: -7.9941 25th pct: -1.8900 Median: -0.3443 75th pct: +0.1062 95th pct: +0.5756 Max: +8.3389 Monthly breakdown: Month RMSE Bias MAE Corr -------------------------------------------- Jan 2.9294 -1.1043 1.4167 0.8749 Feb 2.8924 -1.1596 1.4029 0.8760 Mar 2.5985 -1.0663 1.3425 0.8909 Apr 2.6300 -1.1585 1.3917 0.9009 May 3.0378 -1.4094 1.6038 0.8997 Jun 3.3956 -1.6903 1.8942 0.9063 Jul 3.8389 -1.9587 2.1316 0.9025 Aug 4.4323 -2.3238 2.4582 0.8597 Sep 4.0134 -2.0149 2.1816 0.8659 Oct 3.6094 -1.6231 1.8560 0.8825 Nov 3.4560 -1.4704 1.7454 0.8823 Dec 3.2158 -1.3793 1.6112 0.8904 -------------------------------------------- All 3.3841 -1.5321 1.7551 0.8908 ================================================================================ Period: 2010 | Model: pyGETM ================================================================================ Analysed: 2026-10-08 19:59:28 --- CCI-SSS --- RMSE: 3.1478 Bias: -1.1878 MAE: 1.4997 Correlation: 0.9004 N points: 10,010,490 Model mean: 32.5204 Obs mean: 33.7082 Model std: 5.0644 Obs std: 2.7686 Error distribution: Min: -33.1818 5th pct: -7.7381 25th pct: -1.2036 Median: -0.2130 75th pct: +0.2035 95th pct: +0.7081 Max: +8.3389 ================================================================================ Period: 2011 | Model: pyGETM ================================================================================ Analysed: 2026-10-08 19:59:28 --- CCI-SSS --- RMSE: 3.3950 Bias: -1.5705 MAE: 1.7485 Correlation: 0.8920 N points: 10,010,490 Model mean: 32.1788 Obs mean: 33.7492 Model std: 5.1754 Obs std: 2.7671 Error distribution: Min: -32.7635 5th pct: -7.9544 25th pct: -1.7836 Median: -0.3226 75th pct: +0.0877 95th pct: +0.4930 Max: +5.2453 ================================================================================ Period: 2012 | Model: pyGETM ================================================================================ Analysed: 2026-10-08 19:59:28 --- CCI-SSS --- RMSE: 3.6834 Bias: -1.8413 MAE: 2.0314 Correlation: 0.8862 N points: 10,037,916 Model mean: 31.8626 Obs mean: 33.7039 Model std: 5.3674 Obs std: 2.7840 Error distribution: Min: -32.0248 5th pct: -8.6704 25th pct: -2.6072 Median: -0.4285 75th pct: +0.0601 95th pct: +0.5256 Max: +4.6950 ================================================================================ Period: 2013 | Model: pyGETM ================================================================================ Analysed: 2026-10-08 19:59:28 --- CCI-SSS --- RMSE: 3.2866 Bias: -1.5279 MAE: 1.7399 Correlation: 0.8844 N points: 10,010,490 Model mean: 32.1507 Obs mean: 33.6786 Model std: 5.0254 Obs std: 2.7833 Error distribution: Min: -31.7394 5th pct: -7.6014 25th pct: -1.8144 Median: -0.3704 75th pct: +0.0917 95th pct: +0.5675 Max: +7.2300 📄 Download Statistics Report (txt) · 📄 YAML\nTEMP_SURFACE Metric OSTIA CCI-SST OISST RMSE 1.0235 1.0134 1.0914 Bias +0.0815 +0.1903 +0.1890 MAE 0.7705 0.7624 0.8373 Corr 0.9080 0.9145 0.9076 Model mean 10.7206 10.7167 10.7219 Obs mean 10.6391 10.5283 10.5329 View Full Statistics Report ################################################################################ TEMP_SURFACE Validation Statistics ################################################################################ Format: 1.1 Created: 2026-10-07 10:44:08 Author: K.B. \u0026amp; R.T. Project: OceanICU Institute: BB Area: NSe Experiment: CMEMS/v01P ################################################################################ ================================================================================ Period: 2010-2013 | Model: pyGETM ================================================================================ Analysed: 2026-10-08 19:41:10 --- OSTIA --- RMSE: 1.0235 Bias: +0.0815 MAE: 0.7705 Correlation: 0.9080 N points: 42,772,236 Model mean: 10.7206 Obs mean: 10.6391 Model std: 4.4644 Obs std: 3.9865 Error distribution: Min: -9.0331 5th pct: -1.2623 25th pct: -0.3594 Median: +0.1129 75th pct: +0.5437 95th pct: +1.2877 Max: +8.4756 Monthly breakdown: Month RMSE Bias MAE Corr -------------------------------------------- Jan 1.0676 -0.3571 0.7941 0.9078 Feb 0.9721 -0.3978 0.7014 0.9304 Mar 0.8075 -0.3347 0.5734 0.9441 Apr 0.6502 -0.1716 0.4777 0.9466 May 0.8469 +0.2974 0.6264 0.9114 Jun 1.3200 +0.9144 1.0909 0.8532 Jul 1.4775 +1.0664 1.2364 0.8689 Aug 1.2488 +0.8768 1.0431 0.8746 Sep 0.8323 +0.3127 0.6417 0.9174 Oct 0.7055 -0.1143 0.5421 0.9330 Nov 0.8665 -0.4727 0.6667 0.9257 Dec 1.1138 -0.6757 0.8389 0.9197 -------------------------------------------- All 1.0235 +0.0815 0.7705 0.9080 --- CCI-SST --- RMSE: 1.0134 Bias: +0.1903 MAE: 0.7624 Correlation: 0.9145 N points: 43,019,271 Model mean: 10.7167 Obs mean: 10.5283 Model std: 4.4755 Obs std: 4.0016 Error distribution: Min: -8.7652 5th pct: -1.1065 25th pct: -0.2423 Median: +0.2193 75th pct: +0.6373 95th pct: +1.3719 Max: +8.5508 Monthly breakdown: Month RMSE Bias MAE Corr -------------------------------------------- Jan 1.0182 -0.2280 0.7534 0.9118 Feb 0.9300 -0.2840 0.6624 0.9324 Mar 0.7660 -0.2487 0.5337 0.9457 Apr 0.6117 -0.0923 0.4460 0.9508 May 0.8568 +0.3977 0.6436 0.9194 Jun 1.3698 +1.0155 1.1521 0.8641 Jul 1.5357 +1.1877 1.3194 0.8831 Aug 1.2876 +0.9562 1.0932 0.8833 Sep 0.8482 +0.3962 0.6646 0.9220 Oct 0.6752 -0.0101 0.5187 0.9374 Nov 0.7706 -0.3157 0.5877 0.9313 Dec 1.0163 -0.5255 0.7588 0.9232 -------------------------------------------- All 1.0134 +0.1903 0.7624 0.9145 --- OISST --- RMSE: 1.0914 Bias: +0.1890 MAE: 0.8373 Correlation: 0.9076 N points: 39,162,105 Model mean: 10.7219 Obs mean: 10.5329 Model std: 4.4110 Obs std: 3.8000 Error distribution: Min: -9.0298 5th pct: -1.1334 25th pct: -0.2513 Median: +0.2230 75th pct: +0.6591 95th pct: +1.3733 Max: +8.4328 Monthly breakdown: Month RMSE Bias MAE Corr -------------------------------------------- Jan 1.0989 -0.3326 0.8403 0.8938 Feb 0.9931 -0.5082 0.7390 0.9324 Mar 0.9174 -0.5707 0.7068 0.9440 Apr 0.6731 -0.2686 0.5166 0.9478 May 0.9127 +0.4396 0.7083 0.9070 Jun 1.5056 +1.1939 1.2939 0.8520 Jul 1.7306 +1.4153 1.5124 0.8630 Aug 1.3201 +1.0098 1.1302 0.8731 Sep 0.8922 +0.4790 0.7028 0.9191 Oct 0.6912 +0.1202 0.5404 0.9364 Nov 0.7520 -0.2480 0.5734 0.9279 Dec 1.0429 -0.5105 0.7666 0.9108 -------------------------------------------- All 1.0914 +0.1890 0.8373 0.9076 ================================================================================ Period: 2010 | Model: pyGETM ================================================================================ Analysed: 2026-10-08 19:41:10 --- OSTIA --- RMSE: 1.0286 Bias: +0.2294 MAE: 0.7525 Correlation: 0.9122 N points: 10,685,740 Model mean: 10.6620 Obs mean: 10.4326 Model std: 4.5449 Obs std: 4.1980 Error distribution: Min: -9.0331 5th pct: -1.2545 25th pct: -0.2750 Median: +0.2026 75th pct: +0.6317 95th pct: +1.4268 Max: +8.3935 --- CCI-SST --- RMSE: 1.0467 Bias: +0.3323 MAE: 0.7739 Correlation: 0.9161 N points: 10,744,418 Model mean: 10.6573 Obs mean: 10.3291 Model std: 4.5576 Obs std: 4.2313 Error distribution: Min: -8.7652 5th pct: -1.1274 25th pct: -0.1694 Median: +0.3014 75th pct: +0.7264 95th pct: +1.5511 Max: +8.5508 --- OISST --- RMSE: 1.0995 Bias: +0.2638 MAE: 0.8385 Correlation: 0.9116 N points: 9,783,825 Model mean: 10.6758 Obs mean: 10.4120 Model std: 4.4778 Obs std: 3.9746 Error distribution: Min: -9.0298 5th pct: -1.2742 25th pct: -0.2568 Median: +0.2273 75th pct: +0.6665 95th pct: +1.4132 Max: +7.8931 ================================================================================ Period: 2011 | Model: pyGETM ================================================================================ Analysed: 2026-10-08 19:41:10 --- OSTIA --- RMSE: 0.9444 Bias: +0.0363 MAE: 0.7180 Correlation: 0.9144 N points: 10,685,740 Model mean: 10.8613 Obs mean: 10.8250 Model std: 4.3834 Obs std: 3.8866 Error distribution: Min: -6.6380 5th pct: -1.2575 25th pct: -0.4146 Median: +0.0440 75th pct: +0.4477 95th pct: +1.1213 Max: +7.6276 --- CCI-SST --- RMSE: 0.9577 Bias: +0.1509 MAE: 0.7297 Correlation: 0.9172 N points: 10,747,789 Model mean: 10.8577 Obs mean: 10.7085 Model std: 4.3953 Obs std: 3.8794 Error distribution: Min: -7.0476 5th pct: -1.1272 25th pct: -0.2917 Median: +0.1610 75th pct: +0.5576 95th pct: +1.2350 Max: +7.2308 --- OISST --- RMSE: 1.0557 Bias: +0.1432 MAE: 0.8225 Correlation: 0.9070 N points: 9,783,825 Model mean: 10.8537 Obs mean: 10.7105 Model std: 4.3220 Obs std: 3.6444 Error distribution: Min: -7.1233 5th pct: -1.1736 25th pct: -0.3208 Median: +0.1529 75th pct: +0.5820 95th pct: +1.2248 Max: +6.2930 ================================================================================ Period: 2012 | Model: pyGETM ================================================================================ Analysed: 2026-10-08 19:41:10 --- OSTIA --- RMSE: 0.9663 Bias: +0.0211 MAE: 0.7419 Correlation: 0.9102 N points: 10,715,016 Model mean: 10.7707 Obs mean: 10.7496 Model std: 4.0994 Obs std: 3.6240 Error distribution: Min: -7.4930 5th pct: -1.2869 25th pct: -0.4614 Median: +0.0126 75th pct: +0.4415 95th pct: +1.1355 Max: +8.4756 --- CCI-SST --- RMSE: 0.9601 Bias: +0.1271 MAE: 0.7325 Correlation: 0.9157 N points: 10,778,210 Model mean: 10.7668 Obs mean: 10.6407 Model std: 4.1087 Obs std: 3.6238 Error distribution: Min: -7.0195 5th pct: -1.1264 25th pct: -0.3462 Median: +0.1260 75th pct: +0.5462 95th pct: +1.2260 Max: +6.2578 --- OISST --- RMSE: 0.9981 Bias: +0.1452 MAE: 0.7715 Correlation: 0.9127 N points: 9,810,630 Model mean: 10.7674 Obs mean: 10.6222 Model std: 4.0506 Obs std: 3.5272 Error distribution: Min: -6.6172 5th pct: -1.1106 25th pct: -0.3385 Median: +0.1320 75th pct: +0.5521 95th pct: +1.2272 Max: +6.8678 ================================================================================ Period: 2013 | Model: pyGETM ================================================================================ Analysed: 2026-10-08 19:41:10 --- OSTIA --- RMSE: 1.1433 Bias: +0.0394 MAE: 0.8696 Correlation: 0.8951 N points: 10,685,740 Model mean: 10.5885 Obs mean: 10.5491 Model std: 4.7974 Obs std: 4.1973 Error distribution: Min: -8.0403 5th pct: -1.4568 25th pct: -0.4670 Median: +0.0373 75th pct: +0.4936 95th pct: +1.3031 Max: +8.4393 --- CCI-SST --- RMSE: 1.0834 Bias: +0.1512 MAE: 0.8137 Correlation: 0.9084 N points: 10,748,854 Model mean: 10.5848 Obs mean: 10.4344 Model std: 4.8075 Obs std: 4.2285 Error distribution: Min: -7.6052 5th pct: -1.2384 25th pct: -0.3228 Median: +0.1521 75th pct: +0.5775 95th pct: +1.3387 Max: +7.0844 --- OISST --- RMSE: 1.2022 Bias: +0.2040 MAE: 0.9170 Correlation: 0.9010 N points: 9,783,825 Model mean: 10.5906 Obs mean: 10.3866 Model std: 4.7602 Obs std: 4.0213 Error distribution: Min: -7.9030 5th pct: -1.2197 25th pct: -0.2866 Median: +0.2048 75th pct: +0.6435 95th pct: +1.4210 Max: +8.4328 📄 Download Statistics Report (txt) · 📄 YAML\nPlots Full Period SALT_SURFACE Salinity (surface) — monthly by year\nSalinity (surface) — monthly statistics\nCCI-SSS Salinity (surface) — CCI-SSS comparison\nSalinity (surface) — CCI-SSS monthly maps\nSalinity (surface) — CCI-SSS monthly taylor\nSalinity (surface) — CCI-SSS pdf annual\nSalinity (surface) — CCI-SSS pdf monthly\nSalinity (surface) — CCI-SSS spatial stats\nTEMP_SURFACE Temperature (surface) — monthly by year CCI-SST\nTemperature (surface) — monthly by year OISST\nTemperature (surface) — monthly by year OSTIA\nTemperature (surface) — monthly statistics\nCCI-SST Temperature (surface) — CCI-SST comparison\nTemperature (surface) — CCI-SST monthly maps\nTemperature (surface) — CCI-SST monthly taylor\nTemperature (surface) — CCI-SST pdf annual\nTemperature (surface) — CCI-SST pdf monthly\nTemperature (surface) — CCI-SST spatial stats\nOISST Temperature (surface) — OISST comparison\nTemperature (surface) — OISST monthly maps\nTemperature (surface) — OISST monthly taylor\nTemperature (surface) — OISST pdf annual\nTemperature (surface) — OISST pdf monthly\nTemperature (surface) — OISST spatial stats\nOSTIA Temperature (surface) — OSTIA comparison\nTemperature (surface) — OSTIA monthly maps\nTemperature (surface) — OSTIA monthly taylor\nTemperature (surface) — OSTIA pdf annual\nTemperature (surface) — OSTIA pdf monthly\nTemperature (surface) — OSTIA spatial stats\nSALT_BOTTOM Salinity (bottom) — monthly by year\nSalinity (bottom) — monthly statistics\nNWS-salinity Salinity (bottom) — NWS-salinity comparison\nSalinity (bottom) — NWS-salinity monthly maps\nSalinity (bottom) — NWS-salinity monthly taylor\nSalinity (bottom) — NWS-salinity pdf annual\nSalinity (bottom) — NWS-salinity pdf monthly\nSalinity (bottom) — NWS-salinity spatial stats\nTEMP_BOTTOM Temperature (bottom) — monthly by year\nTemperature (bottom) — monthly statistics\nNWS-bottomT Temperature (bottom) — NWS-bottomT comparison\nTemperature (bottom) — NWS-bottomT monthly maps\nTemperature (bottom) — NWS-bottomT monthly taylor\nTemperature (bottom) — NWS-bottomT pdf annual\nTemperature (bottom) — NWS-bottomT pdf monthly\nTemperature (bottom) — NWS-bottomT spatial stats\nTaylor diagram\nTaylor diagram\nGridded 3D Validation Statistics SALT_3D Metric WOA Bias + View Full Statistics Report ################################################################################ SALT Validation Statistics ################################################################################ Format: 1.1 Created: 2026-10-07 10:45:52 Author: K.B. \u0026amp; R.T. Project: OceanICU Institute: BB Area: NSe Experiment: CMEMS/v01P ################################################################################ ================================================================================ Period: 2010-2013 | Model: pyGETM ================================================================================ Analysed: 2026-10-08 21:06:18 --- WOA --- RMSE: nan Bias: +nan MAE: nan Correlation: nan N points: 0 Model mean: nan Obs mean: nan Model std: nan Obs std: nan Error distribution: Min: +nan 5th pct: +nan 25th pct: +nan Median: +nan 75th pct: +nan 95th pct: +nan Max: +nan 📄 Download Statistics Report (txt) · 📄 YAML\nTEMP_3D Metric WOA Bias + View Full Statistics Report ################################################################################ TEMP Validation Statistics ################################################################################ Format: 1.1 Created: 2026-10-07 10:45:05 Author: K.B. \u0026amp; R.T. Project: OceanICU Institute: BB Area: NSe Experiment: CMEMS/v01P ################################################################################ ================================================================================ Period: 2010-2013 | Model: pyGETM ================================================================================ Analysed: 2026-10-08 21:05:20 --- WOA --- RMSE: nan Bias: +nan MAE: nan Correlation: nan N points: 0 Model mean: nan Obs mean: nan Model std: nan Obs std: nan Error distribution: Min: +nan 5th pct: +nan 25th pct: +nan Median: +nan 75th pct: +nan 95th pct: +nan Max: +nan 📄 Download Statistics Report (txt) · 📄 YAML\nPlots Full Period Salinity at 5 m depth — model vs observations comparison\nSalinity at 5 m depth — spatial distribution of statistics\nSalinity at 50 m depth — model vs observations comparison\nSalinity at 50 m depth — spatial distribution of statistics\nSalinity at 100 m depth — model vs observations comparison\nSalinity at 100 m depth — spatial distribution of statistics\nSalinity at 200 m depth — model vs observations comparison\nSalinity at 200 m depth — spatial distribution of statistics\nSalinity at 500 m depth — model vs observations comparison\nSalinity at 500 m depth — spatial distribution of statistics\nTaylor diagram\nTemperature at 5 m depth — model vs observations comparison\nTemperature at 5 m depth — spatial distribution of statistics\nTemperature at 50 m depth — model vs observations comparison\nTemperature at 50 m depth — spatial distribution of statistics\nTemperature at 100 m depth — model vs observations comparison\nTemperature at 100 m depth — spatial distribution of statistics\nTemperature at 200 m depth — model vs observations comparison\nTemperature at 200 m depth — spatial distribution of statistics\nTemperature at 500 m depth — model vs observations comparison\nTemperature at 500 m depth — spatial distribution of statistics\nICES Point Profiles Statistics PSAL Metric ICES point observations RMSE 1.9617 Bias -0.7278 MAE 0.8141 Corr 0.9075 Model mean 33.6312 Obs mean 34.3591 View Full Statistics Report ################################################################################ PSAL Profile Validation Statistics ################################################################################ Format: 1.1 Created: 2026-10-08 21:17:53 Area: NSe Experiment: CMEMS/v01P ################################################################################ ================================================================================ Period: 2010-2013 | Model: pyGETM ================================================================================ Analysed: 2026-10-08 21:17:53 --- ICES point observations --- RMSE: 1.9617 Bias: -0.7278 MAE: 0.8141 Correlation: 0.9075 N points: 846,438 N profiles: 10,397 Model mean: 33.6312 Obs mean: 34.3591 Model std: 3.9063 Obs std: 2.7537 Error distribution: Min: -24.5303 5th pct: -4.4140 25th pct: -0.5402 Median: -0.1486 75th pct: -0.0040 95th pct: +0.1928 Max: +16.2859 Statistics by depth: Depth N Bias RMSE Corr ------------------------------------------------------ 0-10m 101,274 -2.0683 3.6791 0.9160 10-25m 149,553 -1.6274 3.1850 0.8914 25-50m 187,472 -0.6035 1.3184 0.7602 50-100m 206,281 -0.1984 0.4352 0.7116 100-200m 121,978 -0.0672 0.1804 0.5739 200-500m 76,101 -0.0121 0.0808 0.4401 500-1000m 3,779 -0.0013 0.0356 0.6769 📄 Download Statistics Report (txt) · 📄 YAML\nTEMP Metric ICES point observations RMSE 1.4013 Bias -0.4145 MAE 0.9775 Corr 0.8979 Model mean 8.2113 Obs mean 8.6258 View Full Statistics Report ################################################################################ TEMP Profile Validation Statistics ################################################################################ Format: 1.1 Created: 2026-10-08 21:17:16 Area: NSe Experiment: CMEMS/v01P ################################################################################ ================================================================================ Period: 2010-2013 | Model: pyGETM ================================================================================ Analysed: 2026-10-08 21:17:16 --- ICES point observations --- RMSE: 1.4013 Bias: -0.4145 MAE: 0.9775 Correlation: 0.8979 N points: 846,153 N profiles: 9,332 Model mean: 8.2113 Obs mean: 8.6258 Model std: 2.9599 Obs std: 2.9645 Error distribution: Min: -9.8956 5th pct: -2.7486 25th pct: -0.9931 Median: -0.3058 75th pct: +0.3135 95th pct: +1.4638 Max: +10.8982 Statistics by depth: Depth N Bias RMSE Corr ------------------------------------------------------ 0-10m 100,725 +0.2806 1.3591 0.9656 10-25m 149,723 -0.3741 1.5905 0.9221 25-50m 187,623 -0.9240 1.7805 0.8232 50-100m 206,243 -0.6418 1.3372 0.7382 100-200m 121,959 -0.2187 0.8823 0.5867 200-500m 76,101 +0.0875 0.6843 0.5839 500-1000m 3,779 +0.7384 0.8289 0.0573 📄 Download Statistics Report (txt) · 📄 YAML\nPlots Practical Salinity — statistics vs depth profile\nTemperature — statistics vs depth profile\nArgo Float Profiles Plots Na Argo Overview\nCruise CTD Profiles Plots Year 2010 Show 1 plot Cruise CTD profile overview (North Sea)\nYear 2011 Show 1 plot Cruise CTD profile overview (North Sea)\nYear 2012 Show 1 plot Cruise CTD profile overview (North Sea)\nYear 2013 Show 1 plot Cruise CTD profile overview (North Sea)\nObservations ARGO Observations — 2010-2013 ARGO Station Map\nARGO Observation Density\nCRUISE Observations — 2010-2013 CRUISE Station Map\nCRUISE Observation Density\nICES Observations — 2010-2013 ICES Station Map\nICES Observation Density\nICES PSAL Hovmoller\nICES TEMP Hovmoller\nPLATFORM Observations — 2010-2013 PLATFORM Station Map\nPLATFORM Observation Density\nMethodology Horizontal Validation Model surface fields compared against gridded satellite products and in-situ observations.\nStatistics: RMSE, Bias, MAE, Pearson correlation.\nSpatial statistics show the error distribution across the domain.\nGridded 3D Validation Model vertical profiles compared against gridded 3D climatologies.\nStatistics: RMSE and Bias at each depth level.\nICES Point Profiles Quality-controlled hydrographic profiles from the ICES data portal (temperature, salinity, biogeochemical variables).\nArgo Float Profiles Autonomous profiling floats providing temperature and salinity profiles to 2000 m depth (Ifremer ERDDAP).\nCruise CTD Profiles Shipborne CTD cast profiles from research cruises via the EMODnet Chemistry ERDDAP service.\n← Back to NSe View All Validations →\n","permalink":"https://bolding-bruggeman.com/oceanicu_3d/validations/nse-cmems-v01p/","summary":"\u003cp\u003eHorizontal Validation results comparing model output against observations.\u003c/p\u003e\n\u003ch2 id=\"experiment-information\"\u003eExperiment Information\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eArea\u003c/strong\u003e: NSe\n\u003cstrong\u003eExperiment\u003c/strong\u003e: CMEMS/v01P\n\u003cstrong\u003eValidation Type\u003c/strong\u003e: Horizontal Validation\n\u003cstrong\u003eVariables\u003c/strong\u003e: SALT_BOTTOM, TEMP_BOTTOM, SALT_SURFACE, TEMP_SURFACE\n\u003cstrong\u003ePeriod\u003c/strong\u003e: 2010–2013\u003c/p\u003e\n\u003ch2 id=\"overview\"\u003eOverview\u003c/h2\u003e\n\u003ctable\u003e\n  \u003cthead\u003e\n      \u003ctr\u003e\n          \u003cth\u003eMetric\u003c/th\u003e\n          \u003cth\u003eSALT_BOTTOM / NWS-salinity\u003c/th\u003e\n          \u003cth\u003eTEMP_BOTTOM / NWS-bottomT\u003c/th\u003e\n          \u003cth\u003eSALT_SURFACE / CCI-SSS\u003c/th\u003e\n          \u003cth\u003eTEMP_SURFACE / OSTIA\u003c/th\u003e\n          \u003cth\u003eTEMP_SURFACE / CCI-SST\u003c/th\u003e\n          \u003cth\u003eTEMP_SURFACE / OISST\u003c/th\u003e\n      \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eRMSE\u003c/td\u003e\n          \u003ctd\u003e0.6971\u003c/td\u003e\n          \u003ctd\u003e1.4277\u003c/td\u003e\n          \u003ctd\u003e3.3841\u003c/td\u003e\n          \u003ctd\u003e1.0235\u003c/td\u003e\n          \u003ctd\u003e1.0134\u003c/td\u003e\n          \u003ctd\u003e1.0914\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eBias\u003c/td\u003e\n          \u003ctd\u003e-0.3027\u003c/td\u003e\n          \u003ctd\u003e-0.5865\u003c/td\u003e\n          \u003ctd\u003e-1.5321\u003c/td\u003e\n          \u003ctd\u003e0.0815\u003c/td\u003e\n          \u003ctd\u003e0.1903\u003c/td\u003e\n          \u003ctd\u003e0.1890\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eCorr\u003c/td\u003e\n          \u003ctd\u003e0.8896\u003c/td\u003e\n          \u003ctd\u003e0.9169\u003c/td\u003e\n          \u003ctd\u003e0.8908\u003c/td\u003e\n          \u003ctd\u003e0.9080\u003c/td\u003e\n          \u003ctd\u003e0.9145\u003c/td\u003e\n          \u003ctd\u003e0.9076\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eN points\u003c/td\u003e\n          \u003ctd\u003e1,265,376\u003c/td\u003e\n          \u003ctd\u003e1,265,376\u003c/td\u003e\n          \u003ctd\u003e40,069,386\u003c/td\u003e\n          \u003ctd\u003e42,772,236\u003c/td\u003e\n          \u003ctd\u003e43,019,271\u003c/td\u003e\n          \u003ctd\u003e39,162,105\u003c/td\u003e\n      \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch2 id=\"horizontal-validation\"\u003eHorizontal Validation\u003c/h2\u003e\n\u003ch3 id=\"statistics\"\u003eStatistics\u003c/h3\u003e\n\u003ch3 id=\"salt_bottom\"\u003eSALT_BOTTOM\u003c/h3\u003e\n\u003ctable\u003e\n  \u003cthead\u003e\n      \u003ctr\u003e\n          \u003cth\u003eMetric\u003c/th\u003e\n          \u003cth\u003eNWS-salinity\u003c/th\u003e\n      \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eRMSE\u003c/td\u003e\n          \u003ctd\u003e0.6971\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eBias\u003c/td\u003e\n          \u003ctd\u003e-0.3027\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eMAE\u003c/td\u003e\n          \u003ctd\u003e0.3791\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eCorr\u003c/td\u003e\n          \u003ctd\u003e0.8896\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eModel mean\u003c/td\u003e\n          \u003ctd\u003e34.4084\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eObs mean\u003c/td\u003e\n          \u003ctd\u003e34.7111\u003c/td\u003e\n      \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\u003cdetails\u003e\n\u003csummary\u003eView Full Statistics Report\u003c/summary\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e################################################################################\nSALT_BOTTOM Validation Statistics\n################################################################################\n  Format:     1.1\n  Created:    2026-10-08 20:11:59\n  Area:         NSe\n  Experiment:   CMEMS/v01P\n################################################################################\n\n================================================================================\nPeriod: 2010-2013  |  Model: pyGETM\n================================================================================\nAnalysed: 2026-10-08  20:37:04\n\n--- NWS-salinity ---\n  RMSE:          0.6971\n  Bias:         -0.3027\n  MAE:           0.3791\n  Correlation:   0.8896\n  N points:      1,265,376\n  Model mean:   34.4084\n  Obs mean:     34.7111\n  Model std:    1.3446\n  Obs std:      1.0655\n\n  Error distribution:\n    Min:         -16.5796\n    5th pct:      -1.3642\n    25th pct:     -0.4245\n    Median:       -0.1510\n    75th pct:     -0.0028\n    95th pct:     +0.1602\n    Max:         +8.8929\n\n  Monthly breakdown:\n  Month      RMSE      Bias      MAE    Corr\n  --------------------------------------------\n  Jan      0.6379   -0.2419   0.3419  0.8927\n  Feb      0.6361   -0.2803   0.3705  0.8950\n  Mar      0.6865   -0.3041   0.3890  0.8826\n  Apr      0.6773   -0.3120   0.3933  0.8913\n  May      0.6346   -0.2988   0.3775  0.8943\n  Jun      0.6936   -0.3041   0.3820  0.8910\n  Jul      0.7101   -0.3066   0.3834  0.8920\n  Aug      0.7107   -0.3183   0.3826  0.9039\n  Sep      0.7717   -0.3353   0.3948  0.8947\n  Oct      0.7382   -0.3199   0.3808  0.8991\n  Nov      0.7186   -0.3003   0.3734  0.8872\n  Dec      0.7350   -0.3107   0.3800  0.8810\n  --------------------------------------------\n  All      0.6971   -0.3027   0.3791  0.8896\n\n================================================================================\nPeriod: 2010  |  Model: pyGETM\n================================================================================\nAnalysed: 2026-10-08  20:37:04\n\n--- NWS-salinity ---\n  RMSE:          0.5176\n  Bias:         -0.2093\n  MAE:           0.2886\n  Correlation:   0.9186\n  N points:      316,344\n  Model mean:   34.4712\n  Obs mean:     34.6805\n  Model std:    1.1958\n  Obs std:      1.0703\n\n  Error distribution:\n    Min:         -13.2630\n    5th pct:      -0.9487\n    25th pct:     -0.3140\n    Median:       -0.1237\n    75th pct:     -0.0010\n    95th pct:     +0.1504\n    Max:         +6.7311\n\n================================================================================\nPeriod: 2011  |  Model: pyGETM\n================================================================================\nAnalysed: 2026-10-08  20:37:04\n\n--- NWS-salinity ---\n  RMSE:          0.7867\n  Bias:         -0.3657\n  MAE:           0.4295\n  Correlation:   0.8890\n  N points:      316,344\n  Model mean:   34.3441\n  Obs mean:     34.7098\n  Model std:    1.4523\n  Obs std:      1.0837\n\n  Error distribution:\n    Min:         -14.9381\n    5th pct:      -1.7103\n    25th pct:     -0.4376\n    Median:       -0.1632\n    75th pct:     -0.0159\n    95th pct:     +0.1437\n    Max:         +8.4983\n\n\n================================================================================\nPeriod: 2012  |  Model: pyGETM\n================================================================================\nAnalysed: 2026-10-08  20:37:04\n\n--- NWS-salinity ---\n  RMSE:          0.7846\n  Bias:         -0.3346\n  MAE:           0.4079\n  Correlation:   0.8806\n  N points:      316,344\n  Model mean:   34.4468\n  Obs mean:     34.7814\n  Model std:    1.4133\n  Obs std:      1.0098\n\n  Error distribution:\n    Min:         -16.5796\n    5th pct:      -1.6229\n    25th pct:     -0.4299\n    Median:       -0.1581\n    75th pct:     -0.0037\n    95th pct:     +0.1572\n    Max:         +8.8929\n\n\n================================================================================\nPeriod: 2013  |  Model: pyGETM\n================================================================================\nAnalysed: 2026-10-08  20:37:04\n\n--- NWS-salinity ---\n  RMSE:          0.6646\n  Bias:         -0.3012\n  MAE:           0.3905\n  Correlation:   0.8912\n  N points:      316,344\n  Model mean:   34.3717\n  Obs mean:     34.6729\n  Model std:    1.2980\n  Obs std:      1.0928\n\n  Error distribution:\n    Min:         -12.5484\n    5th pct:      -1.2125\n    25th pct:     -0.4990\n    Median:       -0.1618\n    75th pct:     +0.0028\n    95th pct:     +0.1810\n    Max:         +7.1086\n\u003c/code\u003e\u003c/pre\u003e\u003c/details\u003e\n\u003cp\u003e\u003ca href=\"/validation-data/nse-cmems-v01p/salt_bottom_validation_statistics.txt\"\u003e📄 Download Statistics Report (txt)\u003c/a\u003e · \u003ca href=\"/validation-data/nse-cmems-v01p/salt_bottom_validation_statistics.yaml\"\u003e📄 YAML\u003c/a\u003e\u003c/p\u003e","title":"NSe - Experiment CMEMS/v01P"},{"content":"Harmonic analysis of sea surface elevation compared with satellite products and tide gauge observations.\nAnalysis Summary Analyzed Constituents: K1, K2, M2, N2, O1, P1, Q1, S2\nAnalysis Date: 2026-10-10 Satellite Product: FES2014/TPXO9\nPlots Year 2010 K₁ (lunar-solar diurnal) — model amplitude and phase\nO₁ (principal lunar diurnal) — model amplitude and phase\nP₁ (principal solar diurnal) — model amplitude and phase\nQ₁ (larger lunar elliptic diurnal) — model amplitude and phase\nK₂ (lunar-solar semi-diurnal) — model amplitude and phase\nM₂ (principal lunar semi-diurnal) — model amplitude and phase\nN₂ (larger lunar elliptic semi-diurnal) — model amplitude and phase\nS₂ (principal solar semi-diurnal) — model amplitude and phase\nYear 2011 K₁ (lunar-solar diurnal) — model amplitude and phase\nK₁ (lunar-solar diurnal) — amplitude/phase comparison with GESLA tide gauges\nO₁ (principal lunar diurnal) — model amplitude and phase\nO₁ (principal lunar diurnal) — amplitude/phase comparison with GESLA tide gauges\nP₁ (principal solar diurnal) — model amplitude and phase\nP₁ (principal solar diurnal) — amplitude/phase comparison with GESLA tide gauges\nQ₁ (larger lunar elliptic diurnal) — model amplitude and phase\nQ₁ (larger lunar elliptic diurnal) — amplitude/phase comparison with GESLA tide gauges\nK₂ (lunar-solar semi-diurnal) — model amplitude and phase\nK₂ (lunar-solar semi-diurnal) — amplitude/phase comparison with GESLA tide gauges\nM₂ (principal lunar semi-diurnal) — model amplitude and phase\nM₂ (principal lunar semi-diurnal) — amplitude/phase comparison with GESLA tide gauges\nN₂ (larger lunar elliptic semi-diurnal) — model amplitude and phase\nN₂ (larger lunar elliptic semi-diurnal) — amplitude/phase comparison with GESLA tide gauges\nS₂ (principal solar semi-diurnal) — model amplitude and phase\nS₂ (principal solar semi-diurnal) — amplitude/phase comparison with GESLA tide gauges\nStation amplitude/phase comparison — diurnal constituents\nStation amplitude/phase comparison — semi-diurnal constituents\nTide Gauge Station Comparison Compared with 89 tide gauge stations.\nStation Results (Sample) station lat lon country years_of_obs constituent model_amp obs_amp amp_diff model_pha obs_pha pha_diff roscoff-54-fra-refmar 48.718 -3.966 FRA 53.000 M2 2.642 2.695 -0.053 144.390 142.046 2.344 roscoff-54-fra-refmar 48.718 -3.966 FRA 53.000 S2 0.991 1.005 -0.014 -170.572 -172.254 1.682 roscoff-54-fra-refmar 48.718 -3.966 FRA 53.000 N2 0.547 0.533 0.015 125.540 123.796 1.743 roscoff-54-fra-refmar 48.718 -3.966 FRA 53.000 K2 0.274 0.287 -0.013 -173.331 -174.564 1.232 roscoff-54-fra-refmar 48.718 -3.966 FRA 53.000 K1 0.087 0.082 0.005 91.557 82.046 9.511 roscoff-54-fra-refmar 48.718 -3.966 FRA 53.000 O1 0.067 0.073 -0.006 -24.659 -28.193 3.534 roscoff-54-fra-refmar 48.718 -3.966 FRA 53.000 P1 0.028 0.028 0.001 85.959 72.698 13.261 roscoff-54-fra-refmar 48.718 -3.966 FRA 53.000 Q1 0.020 0.022 -0.002 -73.521 -72.558 -0.963 saint_malo-410-fra-refmar 48.641 -2.028 FRA 35.000 M2 3.630 3.674 -0.043 -179.214 177.534 3.252 saint_malo-410-fra-refmar 48.641 -2.028 FRA 35.000 S2 1.399 1.434 -0.035 -128.506 -132.090 3.584 saint_malo-410-fra-refmar 48.641 -2.028 FRA 35.000 N2 0.735 0.717 0.019 163.856 161.366 2.491 saint_malo-410-fra-refmar 48.641 -2.028 FRA 35.000 K2 0.377 0.410 -0.033 -130.703 -134.593 3.890 saint_malo-410-fra-refmar 48.641 -2.028 FRA 35.000 K1 0.103 0.095 0.009 107.537 95.529 12.009 saint_malo-410-fra-refmar 48.641 -2.028 FRA 35.000 O1 0.077 0.082 -0.005 -10.772 -15.478 4.706 saint_malo-410-fra-refmar 48.641 -2.028 FRA 35.000 P1 0.037 0.035 0.002 104.954 87.756 17.198 saint_malo-410-fra-refmar 48.641 -2.028 FRA 35.000 Q1 0.021 0.024 -0.003 -56.043 -57.656 1.613 st_marys-stm-gbr-da_idh 49.918 -6.317 GBR 9.000 M2 1.701 1.758 -0.057 132.205 131.222 0.983 st_marys-stm-gbr-da_idh 49.918 -6.317 GBR 9.000 S2 0.595 0.603 -0.008 173.473 172.192 1.280 st_marys-stm-gbr-da_idh 49.918 -6.317 GBR 9.000 N2 0.343 0.344 -0.001 112.410 111.930 0.480 st_marys-stm-gbr-da_idh 49.918 -6.317 GBR 9.000 K2 0.170 0.172 -0.002 170.910 169.735 1.176 Download Full Table\nMethodology Harmonic Analysis Tidal constituents extracted using UTide harmonic analysis package. Analysis performed on high-frequency model output (10-15 min resolution) over a minimum period of 60 days.\nSatellite Comparison Model results compared with satellite-derived tidal products:\nFES2014: Finite Element Solution 2014 (1/16° resolution) TPXO9: OSU Tidal Prediction Software (1/30° resolution) Satellite data regridded to model grid using conservative interpolation.\n← Back to NSe\n","permalink":"https://bolding-bruggeman.com/oceanicu_3d/validations/nse-woa-tidal/","summary":"\u003cp\u003eHarmonic analysis of sea surface elevation compared with satellite products and tide gauge observations.\u003c/p\u003e\n\u003ch2 id=\"analysis-summary\"\u003eAnalysis Summary\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eAnalyzed Constituents\u003c/strong\u003e: K1, K2, M2, N2, O1, P1, Q1, S2\u003cbr\u003e\n\u003cstrong\u003eAnalysis Date\u003c/strong\u003e: 2026-10-10\n\u003cstrong\u003eSatellite Product\u003c/strong\u003e: FES2014/TPXO9\u003c/p\u003e\n\u003ch2 id=\"plots\"\u003ePlots\u003c/h2\u003e\n\u003ch3 id=\"year-2010\"\u003eYear 2010\u003c/h3\u003e\n\u003cp\u003e\u003cimg alt=\"K₁ (lunar-solar diurnal) — model amplitude and phase\" loading=\"lazy\" src=\"/validation-data/nse-woa-tidal/physics/pyGETM/2010/tidal/K1_model_amp_phase.png\"\u003e\n\u003cem\u003eK₁ (lunar-solar diurnal) — model amplitude and phase\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg alt=\"O₁ (principal lunar diurnal) — model amplitude and phase\" loading=\"lazy\" src=\"/validation-data/nse-woa-tidal/physics/pyGETM/2010/tidal/O1_model_amp_phase.png\"\u003e\n\u003cem\u003eO₁ (principal lunar diurnal) — model amplitude and phase\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg alt=\"P₁ (principal solar diurnal) — model amplitude and phase\" loading=\"lazy\" src=\"/validation-data/nse-woa-tidal/physics/pyGETM/2010/tidal/P1_model_amp_phase.png\"\u003e\n\u003cem\u003eP₁ (principal solar diurnal) — model amplitude and phase\u003c/em\u003e\u003c/p\u003e","title":"NSe - WOA/tidal - Tidal Analysis"},{"content":"Cross-model, cross-scenario summary of NSe\u0026rsquo;s future open-boundary conditions: delta-change temperature/salinity (CMIP6, bias-corrected against the CMEMS Northwest Shelf reanalysis), tidal elevation/currents (TPXO9 plus the CMIP6 ensemble-mean sea-level trend), and (as of 2026-09-22) delta-change biogeochemistry \u0026ndash; nitrate, phosphate, silicate, oxygen, dissolved inorganic carbon, and alkalinity \u0026ndash; across all three CMIP6 models and both scenarios (see the bug-fix campaign section below for how that came together).\nDelta-change (temperature / salinity) Temperature (thetao) Source: AMM7/AMM15 delta-change: GFDL-ESM4/ssp126 [1985-01-01–2014-12-31 vs 2015-01-01–2100-12-31]\nMethod: OLS linear trend per month Historical period: 1985-01-01 to 2014-12-31 Future period: 2015-01-01 to 2100-12-31 Validation: CMEMS reference vs CMIP6-historical climatology (1985-2014) at the same boundary points \u0026ndash; confirms the bias-correction\u0026rsquo;s own historical baseline is sound before trusting the future delta above.\nSalinity (so) Source: AMM7/AMM15 delta-change: GFDL-ESM4/ssp126 [1985-01-01–2014-12-31 vs 2015-01-01–2100-12-31]\nMethod: OLS linear trend per month Historical period: 1985-01-01 to 2014-12-31 Future period: 2015-01-01 to 2100-12-31 Validation: CMEMS reference vs CMIP6-historical climatology (1985-2014) at the same boundary points \u0026ndash; confirms the bias-correction\u0026rsquo;s own historical baseline is sound before trusting the future delta above.\nTidal + CMIP6-mean (elevation / currents) Sea Surface Height (zos) Source: TPXO9 + (GFDL-ESM4/ssp126 minus 1985-01-01 to 2014-12-31 historical mean, MSL datum) (tables=[\u0026lsquo;Oday\u0026rsquo;, \u0026lsquo;Omon\u0026rsquo;])\nEastward Velocity (uo) Source: TPXO9 + (GFDL-ESM4/ssp126 minus 1985-01-01 to 2014-12-31 historical mean, MSL datum) (tables=[\u0026lsquo;Oday\u0026rsquo;, \u0026lsquo;Omon\u0026rsquo;])\nNorthward Velocity (vo) Source: TPXO9 + (GFDL-ESM4/ssp126 minus 1985-01-01 to 2014-12-31 historical mean, MSL datum) (tables=[\u0026lsquo;Oday\u0026rsquo;, \u0026lsquo;Omon\u0026rsquo;])\nBiogeochemistry — feasibility check (not a boundary condition) Surface, boundary-mean monthly climatology: the real CMEMS NWS BGC reference (black) against CMIP6-historical (1985-2014) climatology from the same 3 models used for physics, sampled at the identical boundary points \u0026ndash; a diagnostic check, not a correction. Nutrients (no3, po4, o2) broadly track the reference\u0026rsquo;s seasonal shape with model-dependent offsets (MPI-ESM1-2-HR consistently low, especially in summer); si shows the same shape but a wider spread. pH is the clear outlier: GFDL-ESM4 sits ~0.5 units below the reference essentially year-round (large enough to suggest a scale/convention mismatch worth checking on its own, not just model bias), and none of the three models reproduce the reference\u0026rsquo;s spring/summer pH rise at all.\nNitrate (no3) Phosphate (po4) Oxygen (o2) pH Silicate (si) Alkalinity, DIC, and ammonium — coverage investigation Extending delta-change to alkalinity (talk), dissolved inorganic carbon (dissic), and ammonium (nh4) hit a harder constraint than the five variables above: none of the three have a CMEMS reanalysis (multi-year, MY) product anywhere in the region.\nvariable NWS MY Baltic MY/ANFC Global MY NWS ANFC talk ✗ (never produced) ✗ (no source at all) ✗ ✓ from 2024-07-29 dissic ✗ (never produced) ✓ (ANFC only) ✗ ✓ from 2024-07-29 nh4 ✗ ✓ (MY and ANFC) ✗ ✓ from 2024-07-29 For talk/dissic, the earliest real CMEMS data of any kind is the NWS analysis-and-forecast (ANFC) product, confirmed via a live dry-run against the real catalogue to start 2024-07-29 (an older config comment, written for AMM7, had claimed 2024-02-28) \u0026ndash; a ~2-year window, not a multi-decade reanalysis. This doesn\u0026rsquo;t block delta-change the way it first appeared to: the CMIP6-vs-CMIP6 trend calculation (the actual future signal) only ever depends on CMIP6\u0026rsquo;s own historical run (1985-2014) and future run, never on CMEMS. CMEMS\u0026rsquo;s only role is supplying realistic day-to-day/seasonal cycling values via analog-date repetition (t_analog) \u0026ndash; which works with a short window, just with less sampled interannual variability than the 16-year window used for temperature/salinity. Decision: proceed using the real ANFC-only window as that reference for talk/dissic.\nnh4 has real CMEMS data (Baltic MY and ANFC both have it, NWS ANFC has it too) but is blocked by a different, genuine gap: some boundary segments have a source for a given period and others don\u0026rsquo;t, and the CMEMS extraction tool (cmems_processor.py) has no NaN-padding support for that mixed-coverage case yet \u0026ndash; a tooling gap, not a data-availability one. Deferred for now.\nTwo ways to get a future signal. Delta-change (used above for thetao/so, and now talk/dissic) keeps CMEMS\u0026rsquo;s own real regional variability as the base and adds only the CMIP6-derived mean climate-change signal on top \u0026ndash; appropriate because CMIP6\u0026rsquo;s own coarse ocean resolution has essentially no realistic regional structure worth preserving even after bias-correcting it directly. That reasoning is much weaker for talk/dissic specifically, given CMEMS itself has almost no real regional variability on record for either \u0026ndash; direct CMIP6 bias-correction (the same method already used for atmospheric meteo forcing) was built and run alongside delta-change for exactly this reason (see the per-segment comparison below): both land close to the real CMEMS reference, so no further decision was forced between them \u0026ndash; the raw (uncorrected) CMIP6 signal is what actually needed correcting, and both methods do that.\nNaive vs. honest CMEMS request, tested directly: two variants of the extraction were run side by side \u0026ndash; one requesting the same full 2010-2026 window as every other boundary variable with no awareness of the ANFC-only limitation, one explicitly bounded to the real ANFC coverage. Result: byte-for-byte identical output (same 750-timestep time axis, same values, same file size) \u0026ndash; the extraction tool already clips silently to whatever the product actually has, with no NaN-padding for the unavailable 2010-2024 span either way. Kept both entries in the source config regardless, since documenting why the window is short is clearer written down explicitly than left implicit.\nBio boundary generation: per-segment method comparison Period-mean per boundary segment (9 segments). The main plot under each variable overlays all three CMIP6 models x both scenarios (delta-change, the actual production method) so the models can be compared against each other directly; expand \u0026ldquo;per-model/scenario method breakdown\u0026rdquo; below it for the raw-CMIP6-vs-corrected comparison for one combo at a time. The raw CMIP6 line there is converted from its native mol m-3 to mmol m-3 here for comparison only (the real raw-CMIP6 files themselves stay unconverted and correctly labeled). **Segment 7 (lon ~12.98°E, lat 54.5-55.25°N \u0026ndash; the Baltic-entrance corner, the Fehmarnbelt/Great Belt) was entirely NaN for dissic/talk in both delta-change and direct bias-correction until 2026-09-22 \u0026ndash; now fixed, two different ways. no3/po4/si/o2 were already real CMEMS data here (a pre-existing per-segment override to a Baltic BGC product, since the long-standing NWS bio_daily product simply doesn\u0026rsquo;t reach this segment \u0026ndash; same mechanism already used for temperature/salinity/currents at this exact segment, a Baltic ocean model, since NWS is masked across the whole Kattegat there). dissic got the same Baltic-product override, newly added. talk has no CMEMS source anywhere, Baltic included (confirmed against the live catalogue) \u0026ndash; instead derived from real Baltic pH + DIC + temperature/salinity through actual seawater carbonate-system equilibrium (PyCO2SYS), not a regression or a raw-CMIP6 fallback. See cli/derive_baltic_talk.py. Every other segment was already real, direct CMEMS data and is untouched.\nNitrate (no3) Per-model/scenario method breakdown (raw CMIP6 vs. delta-change vs. direct bias-correction) GFDL-ESM4 / ssp126 Methods compared: raw CMIP6 (uncorrected), delta-change (plus the real CMEMS reference where its coverage overlaps)\nGFDL-ESM4 / ssp370 Methods compared: delta-change (plus the real CMEMS reference where its coverage overlaps)\nCNRM-ESM2-1 / ssp126 Methods compared: delta-change (plus the real CMEMS reference where its coverage overlaps)\nCNRM-ESM2-1 / ssp370 Methods compared: delta-change (plus the real CMEMS reference where its coverage overlaps)\nMPI-ESM1-2-HR / ssp126 Methods compared: delta-change (plus the real CMEMS reference where its coverage overlaps)\nMPI-ESM1-2-HR / ssp370 Methods compared: delta-change (plus the real CMEMS reference where its coverage overlaps)\nPhosphate (po4) Per-model/scenario method breakdown (raw CMIP6 vs. delta-change vs. direct bias-correction) GFDL-ESM4 / ssp126 Methods compared: raw CMIP6 (uncorrected), delta-change (plus the real CMEMS reference where its coverage overlaps)\nGFDL-ESM4 / ssp370 Methods compared: delta-change (plus the real CMEMS reference where its coverage overlaps)\nCNRM-ESM2-1 / ssp126 Methods compared: delta-change (plus the real CMEMS reference where its coverage overlaps)\nCNRM-ESM2-1 / ssp370 Methods compared: delta-change (plus the real CMEMS reference where its coverage overlaps)\nMPI-ESM1-2-HR / ssp126 Methods compared: delta-change (plus the real CMEMS reference where its coverage overlaps)\nMPI-ESM1-2-HR / ssp370 Methods compared: delta-change (plus the real CMEMS reference where its coverage overlaps)\nSilicate (si) Per-model/scenario method breakdown (raw CMIP6 vs. delta-change vs. direct bias-correction) GFDL-ESM4 / ssp126 Methods compared: raw CMIP6 (uncorrected), delta-change (plus the real CMEMS reference where its coverage overlaps)\nGFDL-ESM4 / ssp370 Methods compared: delta-change (plus the real CMEMS reference where its coverage overlaps)\nCNRM-ESM2-1 / ssp126 Methods compared: delta-change (plus the real CMEMS reference where its coverage overlaps)\nCNRM-ESM2-1 / ssp370 Methods compared: delta-change (plus the real CMEMS reference where its coverage overlaps)\nMPI-ESM1-2-HR / ssp126 Methods compared: delta-change (plus the real CMEMS reference where its coverage overlaps)\nMPI-ESM1-2-HR / ssp370 Methods compared: delta-change (plus the real CMEMS reference where its coverage overlaps)\nOxygen (o2) Per-model/scenario method breakdown (raw CMIP6 vs. delta-change vs. direct bias-correction) GFDL-ESM4 / ssp126 Methods compared: raw CMIP6 (uncorrected), delta-change (plus the real CMEMS reference where its coverage overlaps)\nGFDL-ESM4 / ssp370 Methods compared: delta-change (plus the real CMEMS reference where its coverage overlaps)\nCNRM-ESM2-1 / ssp126 Methods compared: delta-change (plus the real CMEMS reference where its coverage overlaps)\nCNRM-ESM2-1 / ssp370 Methods compared: delta-change (plus the real CMEMS reference where its coverage overlaps)\nMPI-ESM1-2-HR / ssp126 Methods compared: delta-change (plus the real CMEMS reference where its coverage overlaps)\nMPI-ESM1-2-HR / ssp370 Methods compared: delta-change (plus the real CMEMS reference where its coverage overlaps)\nDissolved Inorganic Carbon (dissic) Per-model/scenario method breakdown (raw CMIP6 vs. delta-change vs. direct bias-correction) GFDL-ESM4 / ssp126 Methods compared: raw CMIP6 (uncorrected), delta-change, direct bias-correction (plus the real CMEMS reference where its coverage overlaps)\nGFDL-ESM4 / ssp370 Methods compared: delta-change (plus the real CMEMS reference where its coverage overlaps)\nCNRM-ESM2-1 / ssp126 Methods compared: delta-change (plus the real CMEMS reference where its coverage overlaps)\nCNRM-ESM2-1 / ssp370 Methods compared: delta-change (plus the real CMEMS reference where its coverage overlaps)\nMPI-ESM1-2-HR / ssp126 Methods compared: delta-change (plus the real CMEMS reference where its coverage overlaps)\nMPI-ESM1-2-HR / ssp370 Methods compared: delta-change (plus the real CMEMS reference where its coverage overlaps)\nAlkalinity (talk) Per-model/scenario method breakdown (raw CMIP6 vs. delta-change vs. direct bias-correction) GFDL-ESM4 / ssp126 Methods compared: raw CMIP6 (uncorrected), delta-change, direct bias-correction (plus the real CMEMS reference where its coverage overlaps)\nGFDL-ESM4 / ssp370 Methods compared: delta-change (plus the real CMEMS reference where its coverage overlaps)\nCNRM-ESM2-1 / ssp126 Methods compared: delta-change (plus the real CMEMS reference where its coverage overlaps)\nCNRM-ESM2-1 / ssp370 Methods compared: delta-change (plus the real CMEMS reference where its coverage overlaps)\nMPI-ESM1-2-HR / ssp126 Methods compared: delta-change (plus the real CMEMS reference where its coverage overlaps)\nMPI-ESM1-2-HR / ssp370 Methods compared: delta-change (plus the real CMEMS reference where its coverage overlaps)\nBio boundary generation: 2026-09-22 bug-fix campaign A user question about an odd-looking plot (\u0026ldquo;why does the future signal look 3x the historical one?\u0026rdquo;) led to a single day\u0026rsquo;s debugging that found and fixed five independent, real bugs in the bio boundary pipeline \u0026ndash; every one would otherwise have silently shipped wrong production forcing:\nDiagnostics-only depth bug. The per-segment averaging used to make the comparison plots above checked for a depth dimension by that exact name; raw CMIP6 files use lev instead, so the averaging silently fell back to the whole water column instead of the surface for the raw-CMIP6 line only \u0026ndash; this alone produced the apparent \u0026ldquo;factor of 3\u0026rdquo; jump between the historical and future no3 plots that first prompted this investigation. Diagnostics-only: it never touched any generated boundary file. A real ~1000x-too-small climate-change signal. CMIP6\u0026rsquo;s native units for all six bio variables are mol m-3; the CMEMS reference is mmol m-3. The delta-change generator\u0026rsquo;s shared CMIP6 loader had no unit conversion, so the imported climate-change signal was ~1000x too small for every bio variable, every model, every file this method had ever produced. Fixed at the point CMIP6 data is loaded. A longitude-wraparound bug, regular-grid models only. NSe\u0026rsquo;s boundary mixes mostly-negative longitudes (segments 0-6/8, -7.5° to +4.74°) with segment 7 alone at +12.98°E. For GFDL-ESM4 (the one CMIP6 model here on a regular lon/lat grid), a bounding-box helper in the shared spatial-interpolation library mis-measured that point set\u0026rsquo;s span as ~359° instead of the true ~13°, corrupting the interpolated delta for the whole 310-point set. Worked around per-segment in the boundary generator itself, given the size of what else depends on the shared library. CNRM-ESM2-1/MPI-ESM1-2-HR use a curvilinear grid and a different code path, unaffected. A stale disk-cached climatology. The CMIP6 historical-baseline climatology is cached to disk (recomputing it on every run had turned out to be the real bottleneck, not the boundary-point interpolation). Two models\u0026rsquo; talk/dissic caches had been written minutes before fix #2 landed, so they kept the old, unconverted values \u0026ndash; against the now-correct future values, that made the climate-change delta come out close to the full future absolute value, roughly doubling the final output. Fixed by clearing the affected cache entries and regenerating. Additive delta-change has no positivity floor. no3 came back with a small but real fraction of negative values per segment (up to ~9%), concentrated where the CMEMS reference is already near its seasonal bloom-depletion minimum \u0026ndash; a structural limitation of an additive delta (reference + climate-change shift), not a numerical bug. Switched no3/po4/si/o2/dissic/talk to a multiplicative delta (reference × ratio) instead, which is non-negative by construction given a non-negative reference \u0026ndash; reusing the same additive-vs-multiplicative variable table the direct bias-correction method already used, for the same reason. This also fixed an unrelated-looking anomaly as a side effect: CNRM-ESM2-1\u0026rsquo;s dissic at segment 7 had come out physically implausible for the ssp126 scenario only (a smooth but wrong ~42→110 mmol/m³ trend against a real ~1649 mmol/m³ reference), traced to the additive method\u0026rsquo;s sensitivity to one CMIP6 grid cell\u0026rsquo;s absolute value; the multiplicative form isn\u0026rsquo;t sensitive to that and produces a smooth, plausible ~1680→1739 mmol/m³ instead. The multiplicative switch introduced a smaller failure mode of its own: dividing by a small-but-nonzero historical baseline at one month/point can inflate the ratio past what\u0026rsquo;s physically sensible. Confirmed for no3, at segment 7 (the Baltic-entrance/Fehmarnbelt corner), winter months only, across all three models. The evaluated ratio is now capped to [1/5, 5] before being applied, which removed every case actually caused by ratio instability. A separate, larger set of high values at that same segment turned out to be real, not an artefact: the CMEMS reference itself reaches similarly large nitrate values there on record (a real, river-influenced, short-duration signal \u0026ndash; up to ~94 mmol/m³ in the pure, uncorrected reference) \u0026ndash; kept as-is rather than clipped further, since a hard ceiling there would suppress genuine reference-data behaviour, not a bug.\nFinal verified state, all three CMIP6 models × both scenarios × all six variables (delta-change method; mean / max in mmol m⁻³ across the whole 2015-2100 boundary, dissic/talk given as their boundary-mean at segment 0 for brevity; zero unexplained negative values anywhere \u0026ndash; the handful that do occur are ~-0.01 mmol/m³ o2 values at segment 7\u0026rsquo;s deep layers, real reanalysis noise at the edge of the Baltic\u0026rsquo;s genuinely near-anoxic bottom water, correctly floored to 0):\nGFDL-ESM4\nssp126 GFDL-ESM4\nssp370 CNRM-ESM2-1\nssp126 CNRM-ESM2-1\nssp370 MPI-ESM1-2-HR\nssp126 MPI-ESM1-2-HR\nssp370 no3 5.4 / 71.5 5.8 / 79.3 5.8 / 90.5 5.8 / 105.0 4.7 / 97.9 4.5 / 97.7 po4 0.35 / 11.4 0.35 / 11.8 0.39 / 14.0 0.40 / 16.3 0.31 / 11.4 0.30 / 11.1 si 4.1 / 82.4 4.3 / 76.7 4.8 / 102.2 4.9 / 99.9 3.6 / 89.4 3.6 / 96.3 o2 256.5 / 573.0 253.2 / 570.5 258.8 / 578.3 254.9 / 571.8 256.1 / 569.8 254.9 / 568.4 dissic (seg 0) 2244 2332 2216 2303 2188 2255 talk (seg 0) 2403 2402 2367 2360 2338 2312 CNRM-ESM2-1\u0026rsquo;s no3 shows a noticeably stronger, monotonically-growing correction toward the end of the century \u0026ndash; the ratio cap engages on a growing fraction of month/points, from ~3% by 2075 to ~8.5% by 2100 \u0026ndash; than GFDL-ESM4 or MPI-ESM1-2-HR, whose correction stays small and roughly constant across the run. Likely a real difference in projected nutrient-cycling trend strength between the three CMIP6 Earth-system models, though with a single ensemble member each this can\u0026rsquo;t be fully separated from internal variability.\nA dedicated automated check (final-boundary-check) confirmed every one of the 36 delta-change files above passes cleanly. It also found that the raw, uncorrected CMIP6 boundary files (kept only as a diagnostic reference here, never used as real production forcing) still carry the unconverted-units bug described above, unfixed \u0026ndash; since nothing downstream actually reads that method\u0026rsquo;s output as a boundary condition, this is tracked as a known limitation of that reference-only path rather than fixed immediately.\n","permalink":"https://bolding-bruggeman.com/oceanicu_3d/areas/nse-boundaries/","summary":"\u003cp\u003eCross-model, cross-scenario summary of NSe\u0026rsquo;s future open-boundary conditions: delta-change temperature/salinity (CMIP6, bias-corrected against the CMEMS Northwest Shelf reanalysis), tidal elevation/currents (TPXO9 plus the CMIP6 ensemble-mean sea-level trend), and (as of 2026-09-22) delta-change biogeochemistry \u0026ndash; nitrate, phosphate, silicate, oxygen, dissolved inorganic carbon, and alkalinity \u0026ndash; across all three CMIP6 models and both scenarios (see the bug-fix campaign section below for how that came together).\u003c/p\u003e\n\u003ch2 id=\"delta-change-temperature--salinity\"\u003eDelta-change (temperature / salinity)\u003c/h2\u003e\n\u003ch3 id=\"temperature-thetao\"\u003eTemperature (thetao)\u003c/h3\u003e\n\u003cp\u003e\u003cem\u003eSource: AMM7/AMM15 delta-change: GFDL-ESM4/ssp126 [1985-01-01–2014-12-31 vs 2015-01-01–2100-12-31]\u003c/em\u003e\u003c/p\u003e","title":"NSe — Future Boundary Conditions"},{"content":"NSe Experiment Rankings Composite-score ranking of every experiment validated for NSe, one chart per validation category. See the NSe overview for the full per-experiment statistics these are built from. See All Areas to compare across areas.\nTidal Analysis Horizontal Surface Validation Horizontal Bottom Layer Validation Only one experiment validated so far for this category — ranking needs at least two.\nGridded 3D Validation Only one experiment validated so far for this category — ranking needs at least two.\nCruise CTD Profiles Only one experiment validated so far for this category — ranking needs at least two.\nArgo Profile Validation Only one experiment validated so far for this category — ranking needs at least two.\nICES Point Observation Profiles Only one experiment validated so far for this category — ranking needs at least two.\n","permalink":"https://bolding-bruggeman.com/oceanicu_3d/rankings/nse/","summary":"\u003ch1 id=\"nse-experiment-rankings\"\u003eNSe Experiment Rankings\u003c/h1\u003e\n\u003cp\u003eComposite-score ranking of every experiment validated for \u003cstrong\u003eNSe\u003c/strong\u003e, one chart per validation category. See the \u003ca href=\"/validations/nse-overview/\"\u003eNSe overview\u003c/a\u003e for the full per-experiment statistics these are built from. See \u003ca href=\"/rankings/all/\"\u003eAll Areas\u003c/a\u003e to compare across areas.\u003c/p\u003e\n\u003ch2 id=\"tidal-analysis\"\u003eTidal Analysis\u003c/h2\u003e\n\u003cp\u003e\u003ca id=\"tides\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg alt=\"Tidal experiment ranking\" loading=\"lazy\" src=\"/validations/nse-ranking-tides.png\"\u003e\u003c/p\u003e\n\u003ch2 id=\"horizontal-surface-validation\"\u003eHorizontal Surface Validation\u003c/h2\u003e\n\u003cp\u003e\u003ca id=\"horizon-surface\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg alt=\"Temp experiment ranking\" loading=\"lazy\" src=\"/validations/nse-ranking-horizon_surface-temp_surface.png\"\u003e\u003c/p\u003e\n\u003ch2 id=\"horizontal-bottom-layer-validation\"\u003eHorizontal Bottom Layer Validation\u003c/h2\u003e\n\u003cp\u003e\u003ca id=\"horizon-bottom\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003cem\u003eOnly one experiment validated so far for this category — ranking needs at least two.\u003c/em\u003e\u003c/p\u003e\n\u003ch2 id=\"gridded-3d-validation\"\u003eGridded 3D Validation\u003c/h2\u003e\n\u003cp\u003e\u003ca id=\"gridded-3d\"\u003e\u003c/a\u003e\u003c/p\u003e","title":"NSe Rankings"},{"content":"Regridding User Guide ocean_data.regridding provides xESMF-based regridding with automatic weight-file caching, domain subsetting, and coordinate name normalisation. The regrid command (cli/regrid.py) exposes the same functionality as a command-line tool. ocean-post re-exports the same API from ocean_post.regridding for backward compatibility; import from ocean_data.regridding in new code.\nContents Introduction Installation and setup Command-line interface Basic usage Selecting variables Choosing the regrid method The \u0026ndash;target-variable flag Weight caching Global source grids Skipping domain subsetting Python API RegridManager .regrid() .subset_to_target_domain() regrid_data() open_with_chunks() Weight caching Regridding methods Coordinate name handling Domain subsetting Unit conversion Troubleshooting 1. Introduction Regridding maps data from one spatial grid to another — for example interpolating a global 0.25° satellite observation product onto a regional 1 km model grid, or the other way round, before computing validation statistics.\nYou need regridding when:\nSource and target files have different spatial resolutions or projections. You want to compute point-by-point differences (RMSE, bias) between two datasets that do not share a common grid. You are comparing a regional model against a global observation product and only want the overlapping domain. This module provides:\nRegridManager — full-featured class with weight caching, domain subsetting, and automatic coordinate name handling. regrid_data() — convenience one-liner for single-use regridding. open_with_chunks() — helper to open a NetCDF file with Dask chunking before passing it to the regridder. regrid — CLI wrapper that reads source and target files, regrids all (or selected) variables, and writes a NetCDF output file. 2. Installation and setup Core dependencies (always required):\nThe ocean-stack conda env (see ../ocean-stack/environment.yml) already installs xESMF/ESMF from conda-forge and all four ocean-* packages in editable mode:\nconda activate ocean-stack xESMF depends on ESMF, which is most reliably installed via conda — if building an env manually rather than from ocean-stack:\nconda install -c conda-forge esmf esmpy xesmf pip install xarray numpy Optional — Dask (for chunked/out-of-core processing):\npip install dask If xesmf is not installed, importing RegridManager raises an ImportError with install instructions. The module can still be imported; only calls that construct a RegridManager will fail.\n3. Command-line interface Run regrid --help for a full flag listing. All INFO messages go to stderr; only the xarray repr is printed to stdout.\n3.1 Basic usage Three arguments are always required: --source, --target, and --output.\nregrid \\ --source /data/obs/sst.nc \\ --target /data/model/output.nc \\ --output regridded_sst.nc The source file is opened via DataLoader (supporting the same fallback time-decode chain as ocean_data.data_loader). All data variables in the source file are regridded by default. The target file is opened with plain xr.open_dataset; only its coordinates are used — target values are ignored.\nThe output file is a NetCDF dataset with three extra global attributes recording provenance:\nregrid_method bilinear regrid_source_file /data/obs/sst.nc regrid_target_file /data/model/output.nc 3.2 Selecting variables By default every data variable in the source file is regridded. Use --variable to restrict to one or more variables:\n# Single variable regrid \\ --source /data/obs/sst.nc \\ --target /data/model/output.nc \\ --output regridded_sst.nc \\ --variable analysed_sst # Multiple variables, comma-separated (no spaces around commas) regrid \\ --source /data/obs/ts_profiles.nc \\ --target /data/model/grid.nc \\ --output regridded_ts.nc \\ --variable TEMP,PSAL If a requested variable is not present in the source file the script exits with an error that lists the available names.\n3.3 Choosing the regrid method Use --method to select the interpolation algorithm. The default is bilinear.\nregrid \\ --source /data/obs/sst.nc \\ --target /data/model/output.nc \\ --output regridded_sst.nc \\ --method conservative See Regridding methods for a full comparison.\n3.4 The \u0026ndash;target-variable flag The CLI reads coordinate arrays from a variable in the target file. By default it uses the first data variable it finds. Use --target-variable to specify a different one — useful when the first variable has an unusual grid or when the target file contains multiple grids:\nregrid \\ --source /data/obs/sst.nc \\ --target /data/model/multi_grid.nc \\ --output regridded_sst.nc \\ --target-variable temperature If the specified variable is not found the script exits with an error listing available names.\n3.5 Weight caching Weight files are stored in ./regrid_weights/ by default and reused automatically on subsequent calls with the same source/target grids and method. Use --cache-dir to put them elsewhere, or --no-cache to disable caching entirely:\n# Custom cache directory regrid \\ --source /data/obs/sst.nc \\ --target /data/model/output.nc \\ --output regridded_sst.nc \\ --cache-dir /scratch/weights # Disable caching (always recompute weights) regrid \\ --source /data/obs/sst.nc \\ --target /data/model/output.nc \\ --output regridded_sst.nc \\ --no-cache See Weight caching for details on how the cache key is computed.\n3.6 Global source grids When the source grid wraps around the globe (e.g. OISST, ERA5), pass --periodic so xESMF treats the longitude boundary as periodic rather than as an open edge:\nregrid \\ --source /data/global/oisst.nc \\ --target /data/model/NS.nc \\ --output oisst_on_NS_grid.nc \\ --periodic Without --periodic, points near the dateline or prime meridian can be assigned NaN because xESMF does not look across the boundary.\n3.7 Skipping domain subsetting Before regridding, the source is automatically subset to the target domain plus a 2° buffer (see Domain subsetting). Pass --no-subset to disable this step:\nregrid \\ --source /data/obs/sst.nc \\ --target /data/model/output.nc \\ --output regridded_sst.nc \\ --no-subset Use --no-subset if the source and target grids cover the same region (no memory saving is possible), or when subsetting produces edge artefacts with the conservative method near the domain boundary.\n4. Python API ocean_data is an installed package (pip install -e ../ocean-data, see ../ocean-stack/environment.yml), so a plain import is enough:\nfrom ocean_data.regridding import RegridManager, regrid_data, open_with_chunks 4.1 RegridManager The main class. Instantiate once per session; the object holds the cache directory path and a CoordinateMapper instance that is reused across calls.\nfrom ocean_data.regridding import RegridManager manager = RegridManager( cache_dir=\u0026#39;./regrid_weights\u0026#39;, # directory for weight files verbose=True, # print progress messages ) Constructor parameters:\nParameter Type Default Description cache_dir str ~/.cache/ocean-data/regridding Directory where weight NetCDF files are stored. Created automatically if absent. The regrid CLI overrides this default to ./regrid_weights via its own --cache-dir flag. verbose bool True Enable INFO-level progress output. RegridManager raises ImportError at construction time if xESMF is not installed.\n4.2 .regrid() Regrids a source DataArray onto the grid of a target DataArray.\nimport xarray as xr source_ds = xr.open_dataset(\u0026#39;/data/obs/sst.nc\u0026#39;) target_ds = xr.open_dataset(\u0026#39;/data/model/output.nc\u0026#39;) result = manager.regrid( source_ds[\u0026#39;analysed_sst\u0026#39;], target_ds[\u0026#39;temperature\u0026#39;], ) Parameters:\nParameter Type Default Description source xr.DataArray — Data to regrid. target xr.DataArray — Provides the output grid; its values are ignored. method str 'bilinear' Interpolation method. See Regridding methods. subset bool True Subset source to target domain before regridding. periodic bool False Treat longitude as periodic (use for global grids). reuse_weights bool True Load cached weights if they exist; save new ones when they do not. .regrid() performs no unit conversion — see Unit conversion.\nReturn value: an xr.DataArray on the target grid with the same name and attributes as the source.\n# Bilinear interpolation with weight caching sst_on_model_grid = manager.regrid( source_ds[\u0026#39;analysed_sst\u0026#39;], target_ds[\u0026#39;temperature\u0026#39;], method=\u0026#39;bilinear\u0026#39;, ) # Conservative — better for fluxes; disable subsetting to avoid edge effects flux_on_model_grid = manager.regrid( source_ds[\u0026#39;net_heat_flux\u0026#39;], target_ds[\u0026#39;temperature\u0026#39;], method=\u0026#39;conservative\u0026#39;, subset=False, ) # Nearest-neighbour, no caching mask_on_model_grid = manager.regrid( source_ds[\u0026#39;sea_ice_mask\u0026#39;], target_ds[\u0026#39;temperature\u0026#39;], method=\u0026#39;nearest_s2d\u0026#39;, reuse_weights=False, ) Note: method must be one of the five supported values listed in Regridding methods. Passing an unknown name raises a ValueError.\n4.3 .subset_to_target_domain() Subsets a source DataArray to the bounding box of a target DataArray plus an optional buffer in degrees. Called automatically by .regrid() when subset=True, but also available independently.\nsource_subset = manager.subset_to_target_domain( source_ds[\u0026#39;sst\u0026#39;], target_ds[\u0026#39;temperature\u0026#39;], buffer=2.0, # degrees of padding around target domain ) Parameters:\nParameter Type Default Description source xr.DataArray — Data to subset. target xr.DataArray — Defines the bounding box. buffer float 2.0 Extra degrees of padding on each side. The method resolves the lat/lon coordinate names via CoordinateMapper (falling back to a hardcoded alias list if name_mappings.yaml isn\u0026rsquo;t available), then uses .sel() with a slice on the lat/lon dimension coordinates — sorting first if a dimension is in descending order, since .sel(slice(...)) silently returns zero results otherwise. If no recognized lat/lon dimension is found, the source is returned unchanged and a debug message is logged; if .sel() itself fails for any other reason a warning is logged and the source is also returned unchanged.\n4.4 regrid_data() A convenience wrapper that creates a throwaway RegridManager and calls .regrid() in a single step. Suitable for one-off use in scripts where you do not need to reuse the manager across multiple calls.\nfrom ocean_data.regridding import regrid_data result = regrid_data( source_ds[\u0026#39;sst\u0026#39;], target_ds[\u0026#39;temperature\u0026#39;], method=\u0026#39;bilinear\u0026#39;, subset=True, cache_dir=\u0026#39;./regrid_weights\u0026#39;, verbose=False, ) Parameters:\nParameter Type Default Description source xr.DataArray — Data to regrid. target xr.DataArray — Target grid reference. method str 'bilinear' Interpolation method. subset bool True Subset source to target domain. cache_dir str ~/.cache/ocean-data/regridding Weight file directory. verbose bool False Progress output. Return value: an xr.DataArray on the target grid.\nNote: regrid_data() creates a new RegridManager on every call. For repeated regridding operations (e.g. in a loop over time periods), use a single RegridManager instance directly so the CoordinateMapper and directory handle are reused.\n4.5 open_with_chunks() Opens a NetCDF file and returns a single variable as a Dask-backed DataArray with time chunking. Useful when the source file is too large to fit in memory.\nfrom ocean_data.regridding import open_with_chunks sst = open_with_chunks( \u0026#39;/data/obs/sst_2023.nc\u0026#39;, variable=\u0026#39;analysed_sst\u0026#39;, time_chunk=30, # 30 time steps per Dask chunk ) result = manager.regrid(sst, target_ds[\u0026#39;temperature\u0026#39;]) Parameters:\nParameter Type Default Description path str — Path to the NetCDF file. variable str — Variable name to extract. time_chunk int 30 Number of time steps per Dask chunk. Return value: xr.DataArray backed by Dask (lazy, not yet loaded).\n5. Weight caching Computing xESMF interpolation weights is the most expensive part of regridding. For a pair of grids the weights need to be computed only once; subsequent calls with the same grids reuse the cached file, reducing wall time from minutes to seconds.\nHow the cache key is computed:\nThe weight filename is derived from the first 12 hex characters of an MD5 hash of the following string:\n{source.shape}_{target.shape}_{method}_{src_lat_min}_{src_lat_max}_{src_lon_min}_{src_lon_max}_{tgt_lat_min}_{tgt_lat_max}_{tgt_lon_min}_{tgt_lon_max} Array shape plus the full lat/lon bounding box (min and max, both axes) of each grid are included in the key — not just the latitude minimum — so two grids with the same number of points but covering different geographic regions never share weights. If the lat/lon bounds can\u0026rsquo;t be extracted for some reason, the key silently falls back to shape + method only.\nWeight files are saved as NetCDF (xESMF native format) under the cache directory:\nregrid_weights/ └── weights_bilinear_a3f9c12de801.nc └── weights_conservative_1b4e7f2a9c03.nc Cache behaviour:\nOn first call: weights are computed and saved. On subsequent calls with the same grids: the existing file is loaded. reuse_weights=False (or --no-cache): weights are neither loaded nor saved. Note: If you change the spatial extent of your data between runs but keep the same array shape, the hash will change and a new weight file will be created — the old one is not deleted automatically. Clean up ./regrid_weights/ periodically if you are experimenting with different domains.\n6. Regridding methods Method Flag value Description Best for Bilinear bilinear Distance-weighted average of surrounding source points. Fast and smooth. General purpose; SST, SSH, temperature fields Conservative conservative Preserves the area-weighted integral. Slower than bilinear. Fluxes, precipitation, quantities that must be budgeted Nearest source to dest nearest_s2d Each destination point takes the value of its nearest source point. Categorical masks, flag variables, binary fields Nearest dest to source nearest_d2s Each source point is assigned to its nearest destination point. Upsampling (coarse → fine), filling in sparse observations Patch patch Higher-order conservative. Smoother than conservative but slower. High-accuracy conservative regridding where smoothness matters The default is bilinear. For most ocean validation use cases — SST, SSS, SSH — bilinear is the right choice. Use conservative when you need to preserve area integrals, for example when regridding heat fluxes before computing a budget.\n7. Coordinate name handling xESMF requires that the latitude and longitude coordinate arrays in both source and target DataArrays be named exactly lat and lon. Many ocean model formats use different names:\nModel Latitude coord Longitude coord NEMO nav_lat nav_lon Custom (this project) latt lont ROMS lat_rho lon_rho CESM TLAT TLONG ERA5 latitude longitude RegridManager._prepare_for_xesmf() handles this automatically. Before building the xESMF regridder it uses CoordinateMapper (from ocean_data.name_mappings, driven by ocean-data/config/name_mappings.yaml) to find the actual geographic coordinate names, and handles the two cases differently:\nDimension coordinate (e.g. ERA5\u0026rsquo;s latitude/longitude, which are also dimension names): left alone. xESMF\u0026rsquo;s CF accessor already finds it by standard_name — adding a lat alias on top would create a second coordinate with the same standard_name and make xESMF raise \u0026ldquo;multiple variables for key \u0026rsquo;latitude\u0026rsquo;\u0026rdquo; during conservative regridding.\nNon-dimension coordinate (e.g. NEMO\u0026rsquo;s nav_lat/nav_lon, this project\u0026rsquo;s latt/lont, both 2-D arrays indexed by y/x): a lat/lon alias is assigned and the original coordinate name is dropped:\n# Internally, for a NEMO file with a 2-D nav_lat coordinate: data = data.assign_coords(lat=data.coords[\u0026#39;nav_lat\u0026#39;]).drop_vars(\u0026#39;nav_lat\u0026#39;) _prepare_for_xesmf() also sorts any descending 1-D lat/lon dimension axis to ascending (xESMF requires monotonically increasing coordinates) and converts a non-contiguous array to C-contiguous (xESMF otherwise warns and runs slower).\nThis happens transparently — you never need to rename coordinates yourself.\nTo add support for a new model format, add its coordinate names to ocean-data/config/name_mappings.yaml under the latitude and longitude alias lists. No Python changes are needed.\nNote: for a non-dimension coordinate, the original name (nav_lat, latt, etc.) is dropped, not kept alongside the new lat/lon alias — the regridded result only has lat/lon. For a dimension coordinate like ERA5\u0026rsquo;s latitude/longitude, nothing is renamed or dropped at all; the original name is what xESMF actually uses.\n8. Domain subsetting When the source grid covers a much larger area than the target (for example regridding a global observation product onto a small regional model), loading the full source into memory before regridding is wasteful. The default behaviour is to subset the source first:\n# The regrid() call automatically subsets when subset=True (the default) result = manager.regrid(source_da, target_da, subset=True) # Which is equivalent to calling these two steps manually: source_sub = manager.subset_to_target_domain(source_da, target_da, buffer=2.0) result = manager.regrid(source_sub, target_da, subset=False) The buffer parameter (default 2.0°) adds a margin around the target bounding box before subsetting. This ensures that interpolation stencils near the domain edges have enough surrounding source points to produce accurate results.\nWhen to use --no-subset / subset=False:\nSource and target cover the same region (no data would be discarded). The source grid is small and fits in memory anyway. Conservative regridding near the domain edge produces artefacts because the clipped source boundary introduces sharp gradients — in this case load the full source and let xESMF use its natural boundary conditions. Note: Subsetting uses .sel() with a slice on the lat/lon dimension (sorted to ascending order first if needed), using bounds read from the actual geographic coordinate array (resolved via CoordinateMapper, so it works whether that array is lat, nav_lat, latt, etc.). If the dimension can\u0026rsquo;t be identified at all, or .sel() fails for any reason (e.g. the dimension has no attached index coordinate to select on, which can happen for some 2-D-coordinate grids), subsetting is skipped: a warning is logged and the source is returned unchanged rather than raising. For such files use subset=False explicitly to skip the attempt.\n9. Unit conversion RegridManager.regrid() performs no unit conversion of its own — it regrids values exactly as given, in whatever units the source happens to be in. If the source and target are in different units (e.g. temperature in Kelvin vs Celsius) the regridded output stays in the source\u0026rsquo;s original units; convert before or after calling .regrid().\nOne existing convention for this, used by gridded-2d-validation\u0026rsquo;s own observation-loading config (not by regrid/RegridManager itself), is a per-dataset offset/scale_factor pair next to the dataset path:\nobservations: sst: CCI-SST: path: \u0026#34;${CCI_SST_FOLDER}/sst_{year}.nc\u0026#34; offset: -273.15 # Kelvin → Celsius, applied after loading That mechanism is specific to the observation-loading step of the validation pipeline, not a general feature of ocean_data.regridding — if you\u0026rsquo;re calling RegridManager/regrid_data directly, apply any unit conversion to the source DataArray yourself before passing it in.\n10. Troubleshooting ImportError: xESMF is required\nImportError: xESMF is required. Install with: pip install xesmf Install xESMF via conda for the most reliable ESMF build:\nconda install -c conda-forge esmf esmpy xesmf ValueError: Method must be one of [...]\nThe --method value (or method argument) is not one of the five supported names. Check the Regridding methods table.\nValueError: --target-variable 'X' not found in target file\nThe variable named by --target-variable does not exist in the target file. Run a quick inspection to see what variables are available:\ndata-loader /data/model/output.nc --info Output is all NaN\nThis usually means xESMF could not find geographic coordinates. The most common cause is that _prepare_for_xesmf() could not map the coordinate names because they are not in ocean-data/config/name_mappings.yaml.\nCheck what coordinate names the file uses:\ndata-loader /data/model/output.nc --info Then add the missing names to ocean-data/config/name_mappings.yaml under latitude or longitude.\nOutput has data only in part of the domain / edge NaN strip\nThe source does not fully cover the target domain after subsetting, or the buffer was too small. Try:\nIncreasing the buffer by calling .subset_to_target_domain() manually with a larger buffer value before passing to .regrid(subset=False). Passing --no-subset / subset=False to use the full source extent. For global sources that wrap around the dateline, add --periodic / periodic=True. Conservative regridding raises an ESMF error about grid bounds\nThe conservative method requires cell-corner coordinates (bounds), not just cell-centre coordinates. If the source or target file does not contain bounds (e.g. lat_bnds, lon_bnds), xESMF falls back to estimating them, which may fail for irregular grids. Switch to bilinear or nearest_s2d for irregular-grid files that lack explicit bounds.\nWeight file is stale after changing the source domain\nIf you re-run with a different spatial subset of the same source file but the array shape happens to be the same as before, the hash changes (because the coordinate extremes change) and a fresh weight file is created automatically. If the shape also changed, the hash changes too. Stale weight files are never automatically deleted; remove the ./regrid_weights/ directory to start fresh.\nCould not subset source to target domain warning\nThe source file has 2-D dimension coordinates (e.g. curvilinear NEMO grids where y/x are the dimensions and nav_lat/nav_lon are 2-D non-dimension coords). .sel() with a lat/lon slice cannot operate on such grids. Pass subset=False (or --no-subset) to skip subsetting and proceed with regridding on the full source array.\n","permalink":"https://bolding-bruggeman.com/oceanicu_3d/guides/regridding/","summary":"\u003ch1 id=\"regridding-user-guide\"\u003eRegridding User Guide\u003c/h1\u003e\n\u003cp\u003e\u003ccode\u003eocean_data.regridding\u003c/code\u003e provides xESMF-based regridding with automatic\nweight-file caching, domain subsetting, and coordinate name normalisation.\nThe \u003ccode\u003eregrid\u003c/code\u003e command (\u003ccode\u003ecli/regrid.py\u003c/code\u003e) exposes the same functionality as a\ncommand-line tool. ocean-post re-exports the same API from\n\u003ccode\u003eocean_post.regridding\u003c/code\u003e for backward compatibility; import from\n\u003ccode\u003eocean_data.regridding\u003c/code\u003e in new code.\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"contents\"\u003eContents\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003e\u003ca href=\"#1-introduction\"\u003eIntroduction\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#2-installation-and-setup\"\u003eInstallation and setup\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#3-command-line-interface\"\u003eCommand-line interface\u003c/a\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"#31-basic-usage\"\u003eBasic usage\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#32-selecting-variables\"\u003eSelecting variables\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#33-choosing-the-regrid-method\"\u003eChoosing the regrid method\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#34-the---target-variable-flag\"\u003eThe \u0026ndash;target-variable flag\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#35-weight-caching\"\u003eWeight caching\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#36-global-source-grids\"\u003eGlobal source grids\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#37-skipping-domain-subsetting\"\u003eSkipping domain subsetting\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#4-python-api\"\u003ePython API\u003c/a\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"#41-regridmanager\"\u003eRegridManager\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#42-regrid\"\u003e.regrid()\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#43-subset_to_target_domain\"\u003e.subset_to_target_domain()\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#44-regrid_data\"\u003eregrid_data()\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#45-open_with_chunks\"\u003eopen_with_chunks()\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#5-weight-caching\"\u003eWeight caching\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#6-regridding-methods\"\u003eRegridding methods\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#7-coordinate-name-handling\"\u003eCoordinate name handling\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#8-domain-subsetting\"\u003eDomain subsetting\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#9-unit-conversion\"\u003eUnit conversion\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#10-troubleshooting\"\u003eTroubleshooting\u003c/a\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003chr\u003e\n\u003ch2 id=\"1-introduction\"\u003e1. Introduction\u003c/h2\u003e\n\u003cp\u003eRegridding maps data from one spatial grid to another — for example\ninterpolating a global 0.25° satellite observation product onto a regional\n1 km model grid, or the other way round, before computing validation\nstatistics.\u003c/p\u003e","title":"Regridding"}]