<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Guides on Ocean Model Validation</title>
    <link>https://bolding-bruggeman.com/oceanicu_3d/guides/</link>
    <description>Recent content in Guides on Ocean Model Validation</description>
    <generator>Hugo</generator>
    <language>en-us</language>
    <lastBuildDate>Sat, 10 Oct 2026 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://bolding-bruggeman.com/oceanicu_3d/guides/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Tidal Analysis</title>
      <link>https://bolding-bruggeman.com/oceanicu_3d/guides/tidal-analysis/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://bolding-bruggeman.com/oceanicu_3d/guides/tidal-analysis/</guid>
      <description>&lt;h1 id=&#34;tidal-analysis-guide&#34;&gt;Tidal Analysis Guide&lt;/h1&gt;
&lt;h2 id=&#34;overview&#34;&gt;Overview&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;tidal-analysis&lt;/code&gt; extracts tidal harmonic constituents from model output and
validates them against satellite tidal atlases (FES2014, TPXO9) or tide gauge
records from the GESLA database.&lt;/p&gt;
&lt;p&gt;The harmonic analysis uses &lt;code&gt;utide&lt;/code&gt; 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.&lt;/p&gt;
&lt;h2 id=&#34;analysis-modes&#34;&gt;Analysis modes&lt;/h2&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Mode&lt;/th&gt;
          &lt;th&gt;Flag&lt;/th&gt;
          &lt;th&gt;Description&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;gesla&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;--mode gesla&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Harmonic analysis at GESLA tide gauge locations (fast; recommended; config default)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;spatial&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;--mode spatial&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Harmonic analysis on the full model grid, compared to a tidal atlas&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;both&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;--mode both&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Run spatial and GESLA together&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;stations&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;--mode stations&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Named stations listed under &lt;code&gt;stations:&lt;/code&gt; in config&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&#34;model-source---source----experiment&#34;&gt;Model source: &lt;code&gt;--source&lt;/code&gt; / &lt;code&gt;--experiment&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;The model file to read no longer lives in the per-run config. It comes from
&lt;a href=&#34;https://github.com/bolding/ocean-post/blob/main/config/sources.yaml&#34;&gt;config/sources.yaml&lt;/a&gt;,
keyed by &lt;code&gt;--source&lt;/code&gt;, with &lt;code&gt;--experiment&lt;/code&gt; naming the run folder under that
source:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Gridded 2D Validation</title>
      <link>https://bolding-bruggeman.com/oceanicu_3d/guides/gridded-2d-validation/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://bolding-bruggeman.com/oceanicu_3d/guides/gridded-2d-validation/</guid>
      <description>&lt;h1 id=&#34;gridded-2d-validation-guide&#34;&gt;Gridded 2D Validation Guide&lt;/h1&gt;
&lt;h2 id=&#34;overview&#34;&gt;Overview&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;gridded-2d-validation&lt;/code&gt; compares any horizontal 2-D model field against a
gridded observation product.  Three layer modes are supported:&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Layer&lt;/th&gt;
          &lt;th&gt;Description&lt;/th&gt;
          &lt;th&gt;Typical use&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;surface&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;2-D field or top of 3-D output&lt;/td&gt;
          &lt;td&gt;SST, SSS, SSH&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;bottom&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Deepest wet cell of 3-D output&lt;/td&gt;
          &lt;td&gt;Bottom temperature / salinity&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;&amp;lt;depth_m&amp;gt;&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Horizontal slice at a fixed depth (m)&lt;/td&gt;
          &lt;td&gt;Depth-layer climatology&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Multiple layers can be run in a single invocation.&lt;/p&gt;
&lt;p&gt;There are four shipped configs:
&lt;a href=&#34;https://github.com/bolding/ocean-post/blob/main/config/gridded_2d_validation.yaml&#34;&gt;&lt;code&gt;gridded_2d_validation.yaml&lt;/code&gt;&lt;/a&gt;
is the generic one, with any combination of layers via &lt;code&gt;--layers&lt;/code&gt;.
&lt;a href=&#34;https://github.com/bolding/ocean-post/blob/main/config/gridded_2d_validation_surface.yaml&#34;&gt;&lt;code&gt;gridded_2d_validation_surface.yaml&lt;/code&gt;&lt;/a&gt;,
&lt;code&gt;_bottom.yaml&lt;/code&gt; and &lt;code&gt;_depths.yaml&lt;/code&gt; are the dedicated single-purpose variants
used for NSe.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Gridded 3D Validation</title>
      <link>https://bolding-bruggeman.com/oceanicu_3d/guides/gridded-3d-validation/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://bolding-bruggeman.com/oceanicu_3d/guides/gridded-3d-validation/</guid>
      <description>&lt;h1 id=&#34;gridded-3d-validation-guide&#34;&gt;Gridded 3D Validation Guide&lt;/h1&gt;
&lt;h2 id=&#34;overview&#34;&gt;Overview&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;gridded-3d-validation&lt;/code&gt; validates model temperature and salinity (or any
3-D variable) against a &lt;strong&gt;gridded observation product&lt;/strong&gt; — WOA23 climatology,
CMIP6 ensembles, Copernicus reanalysis, or any dataset that provides values
at every horizontal grid point and a set of depth levels.&lt;/p&gt;
&lt;p&gt;The observations are regridded onto the model grid and compared cell-by-cell,
enabling:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Spatial statistics maps (RMSE, bias, MAE, correlation per grid point)&lt;/li&gt;
&lt;li&gt;Time-mean comparison maps at selected depth levels&lt;/li&gt;
&lt;li&gt;Monthly statistics bar charts&lt;/li&gt;
&lt;li&gt;Statistics text file (overall + monthly breakdown)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;When to use this tool vs profile validation:&lt;/strong&gt;
Use &lt;code&gt;gridded-3d-validation&lt;/code&gt; for climatologies or reanalyses that cover the
full model domain at all depths.  Use &lt;code&gt;argo-profiles&lt;/code&gt;, &lt;code&gt;cruise-ctd-profiles&lt;/code&gt;,
or &lt;code&gt;fixed-platform&lt;/code&gt; for sparse in-situ observations scattered in space and
time.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Profile Validation</title>
      <link>https://bolding-bruggeman.com/oceanicu_3d/guides/profile-validation/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://bolding-bruggeman.com/oceanicu_3d/guides/profile-validation/</guid>
      <description>&lt;h1 id=&#34;profile-validation-guide&#34;&gt;Profile Validation Guide&lt;/h1&gt;
&lt;h2 id=&#34;overview&#34;&gt;Overview&lt;/h2&gt;
&lt;p&gt;Five scripts share the same profile validation workflow:&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Command&lt;/th&gt;
          &lt;th&gt;Observation source&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;argo-profiles&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Argo floats (Ifremer ERDDAP)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;glodap-profiles&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;GLODAP v2.2023 bottle data&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;wod-profiles&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;World Ocean Database (NOAA ERDDAP)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;cruise-ctd-profiles&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;ICES / EMODnet cruise CTD casts&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;ices-profiles&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;ICES/ECOVAL profiles (local Feather files)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;fixed-platform&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;EMODnet fixed-platform (mooring/buoy) profiles&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;All six follow the same config structure, output layout, and command-line flags.&lt;/p&gt;
&lt;h2 id=&#34;config-structure&#34;&gt;Config structure&lt;/h2&gt;
&lt;p&gt;Annotated example configs:
&lt;a href=&#34;https://github.com/bolding/ocean-post/blob/main/config/argo_profiles.yaml&#34;&gt;config/argo_profiles.yaml&lt;/a&gt; ·
&lt;a href=&#34;https://github.com/bolding/ocean-post/blob/main/config/glodap_profiles.yaml&#34;&gt;config/glodap_profiles.yaml&lt;/a&gt; ·
&lt;a href=&#34;https://github.com/bolding/ocean-post/blob/main/config/cruise_ctd_profiles.yaml&#34;&gt;config/cruise_ctd_profiles.yaml&lt;/a&gt; ·
&lt;a href=&#34;https://github.com/bolding/ocean-post/blob/main/config/wod_profiles.yaml&#34;&gt;config/wod_profiles.yaml&lt;/a&gt; ·
&lt;a href=&#34;https://github.com/bolding/ocean-post/blob/main/config/ices_profiles.yaml&#34;&gt;config/ices_profiles.yaml&lt;/a&gt; ·
&lt;a href=&#34;https://github.com/bolding/ocean-post/blob/main/config/fixed_platform.yaml&#34;&gt;config/fixed_platform.yaml&lt;/a&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>MLE Comparison</title>
      <link>https://bolding-bruggeman.com/oceanicu_3d/guides/mle-comparison/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://bolding-bruggeman.com/oceanicu_3d/guides/mle-comparison/</guid>
      <description>&lt;h1 id=&#34;mle-cross-experiment-comparison-guide&#34;&gt;MLE Cross-Experiment Comparison Guide&lt;/h1&gt;
&lt;h2 id=&#34;overview&#34;&gt;Overview&lt;/h2&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;MLE 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 &amp;ldquo;optimal fingerprinting&amp;rdquo;
framework used in climate attribution (Allen &amp;amp; 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.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Run Validation</title>
      <link>https://bolding-bruggeman.com/oceanicu_3d/guides/run-validation/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://bolding-bruggeman.com/oceanicu_3d/guides/run-validation/</guid>
      <description>&lt;h1 id=&#34;run-analyses-guide&#34;&gt;run-analyses Guide&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;This guide used to document a &lt;code&gt;run-validation&lt;/code&gt; command. That command no
longer exists — it was replaced by &lt;code&gt;run-analyses&lt;/code&gt; (&lt;code&gt;cli/run_analyses.py&lt;/code&gt;),
which has a different config layout and CLI. This page now documents the
current tool; the title and URL are unchanged.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;overview&#34;&gt;Overview&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;run-analyses&lt;/code&gt; is the master orchestrator.  It calls each step&amp;rsquo;s own CLI
entry point as a subprocess, reusing one YAML config per step
(&lt;code&gt;config/run_analyses.yaml&lt;/code&gt; maps step names to those per-step config
files).&lt;/p&gt;</description>
    </item>
    <item>
      <title>Scenario Analysis</title>
      <link>https://bolding-bruggeman.com/oceanicu_3d/guides/scenarios/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://bolding-bruggeman.com/oceanicu_3d/guides/scenarios/</guid>
      <description>&lt;h1 id=&#34;scenario-analysis-guide&#34;&gt;Scenario Analysis Guide&lt;/h1&gt;
&lt;h2 id=&#34;overview&#34;&gt;Overview&lt;/h2&gt;
&lt;p&gt;The scenario workflow has three stages:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;CMIP6 forcing  ──► bc correct ──► bias-corrected forcing
                                        │
                               ocean model (future run)
                                        │
                         ┌─────────────┴─────────────┐
                   single-scenario              multi-scenario
                  (trends, changes)       (SSP comparison)
&lt;/code&gt;&lt;/pre&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Bias-correct&lt;/strong&gt; CMIP6 atmospheric forcing against ERA5 (or equivalent)
so its statistical properties match the observational reference over the
calibration period.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Run the ocean model&lt;/strong&gt; with the corrected forcing for each SSP scenario.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Analyse&lt;/strong&gt; the ocean output — trend maps, time series, regional means —
for one scenario at a time or across multiple scenarios simultaneously.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id=&#34;step-1--bias-correction&#34;&gt;Step 1 — Bias correction&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; &lt;code&gt;bc correct&lt;/code&gt;, &lt;code&gt;bc diagnostics&lt;/code&gt;, and &lt;code&gt;bc check&lt;/code&gt; have moved to
&lt;strong&gt;ocean-prep&lt;/strong&gt;.  Install and run them from the &lt;code&gt;ocean-prep&lt;/code&gt; repo.
Config and guides are at &lt;code&gt;ocean-prep/config/bc_correct_example.yaml&lt;/code&gt; and
&lt;code&gt;ocean-prep/guides/&lt;/code&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Push To Remote</title>
      <link>https://bolding-bruggeman.com/oceanicu_3d/guides/push-to-remote/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://bolding-bruggeman.com/oceanicu_3d/guides/push-to-remote/</guid>
      <description>&lt;h1 id=&#34;push-to-remote-guide&#34;&gt;push-to-remote Guide&lt;/h1&gt;
&lt;h2 id=&#34;overview&#34;&gt;Overview&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;push-to-remote&lt;/code&gt; is the other half of the post-simulation handoff, alongside
&lt;a href=&#34;update-from-remote.md&#34;&gt;update-from-remote&lt;/a&gt;. Run it &lt;strong&gt;on the simulation
server&lt;/strong&gt; (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 &amp;ldquo;analysis server&amp;rdquo;, e.g. &lt;code&gt;bb-server1&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;It 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
&lt;strong&gt;initiated from the simulation server&lt;/strong&gt;, pushing out — never initiated
from the analysis server trying to pull in. &lt;code&gt;push-to-remote&lt;/code&gt; wraps
&lt;code&gt;manage-analyses sync ... --put&lt;/code&gt;, which is exactly that: an &lt;code&gt;rsync&lt;/code&gt;, run
from here, pushing local files out.&lt;/p&gt;</description>
    </item>
    <item>
      <title>River Flow and Nutrient Load Projection</title>
      <link>https://bolding-bruggeman.com/oceanicu_3d/guides/river-projection/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://bolding-bruggeman.com/oceanicu_3d/guides/river-projection/</guid>
      <description>&lt;h1 id=&#34;river-flow-and-nutrient-load-projection-guide&#34;&gt;River Flow and Nutrient Load Projection Guide&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;river-projection&lt;/code&gt; (stage 1, below) lives in &lt;code&gt;ocean-prep&lt;/code&gt;&lt;/strong&gt;, alongside
&lt;code&gt;bc-correct&lt;/code&gt;/&lt;code&gt;bc-diagnostics&lt;/code&gt; — install and run it from the &lt;code&gt;ocean-prep&lt;/code&gt;
repo (&lt;code&gt;cli/river_projection.py&lt;/code&gt;), with its config at
&lt;code&gt;ocean-prep/config/river_projection_example.yaml&lt;/code&gt;. &lt;code&gt;river-diagnostics&lt;/code&gt;
(stage 2) stays in &lt;code&gt;ocean-post&lt;/code&gt;. Confirmed 2026-10-07; this page previously
referenced a &lt;code&gt;config/river_projection.yaml&lt;/code&gt; in &lt;code&gt;ocean-post&lt;/code&gt; that was never
there, and the real tool and config were found in &lt;code&gt;ocean-prep&lt;/code&gt; instead. No
project-specific copy of the config exists yet in this checkout — the only
one found is &lt;code&gt;ocean-prep&lt;/code&gt;&amp;rsquo;s own example.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Update From Remote</title>
      <link>https://bolding-bruggeman.com/oceanicu_3d/guides/update-from-remote/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://bolding-bruggeman.com/oceanicu_3d/guides/update-from-remote/</guid>
      <description>&lt;h1 id=&#34;update-from-remote-guide&#34;&gt;update-from-remote Guide&lt;/h1&gt;
&lt;h2 id=&#34;overview&#34;&gt;Overview&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;update-from-remote&lt;/code&gt; 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:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;sync&lt;/strong&gt; — rsyncs the remote &lt;code&gt;analyses/&lt;/code&gt; tree to the local machine&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;merge&lt;/strong&gt; — flushes staging YAML records into &lt;code&gt;simulation_list.db&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;scan&lt;/strong&gt; — registers any experiments found on the filesystem but not yet in the DB&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;report&lt;/strong&gt; — regenerates all Hugo pages via &lt;code&gt;ocean-reporting&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;deploy&lt;/strong&gt; — builds and pushes the Hugo site to gh-pages (only with &lt;code&gt;--deploy&lt;/code&gt;)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Both &lt;code&gt;REMOTE&lt;/code&gt; and &lt;code&gt;LOCAL_ANALYSES&lt;/code&gt; are required positional arguments.  There are
no defaults, which prevents accidentally syncing into the wrong directory.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Manage Analyses</title>
      <link>https://bolding-bruggeman.com/oceanicu_3d/guides/manage-analyses/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://bolding-bruggeman.com/oceanicu_3d/guides/manage-analyses/</guid>
      <description>&lt;h1 id=&#34;manage-analyses-guide&#34;&gt;manage-analyses Guide&lt;/h1&gt;
&lt;h2 id=&#34;overview&#34;&gt;Overview&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;manage-analyses&lt;/code&gt; is the housekeeping tool for the &lt;code&gt;analyses/&lt;/code&gt; output tree.
All subcommands default to a &lt;strong&gt;dry run&lt;/strong&gt; — add &lt;code&gt;--apply&lt;/code&gt; to actually execute.&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Subcommand&lt;/th&gt;
          &lt;th&gt;Purpose&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;clean&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Remove files at the wrong directory depth (non-canonical layout)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;wipe&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Remove all regeneratable outputs so scripts can be re-run from scratch&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;sync&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Rsync the remote analyses tree to a local directory&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;import-stats&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Import existing CSV statistics files into &lt;code&gt;statistics.db&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&#34;clean&#34;&gt;clean&lt;/h2&gt;
&lt;p&gt;Removes files that do not conform to the canonical layout — for example, plots
written directly under &lt;code&gt;validations/&amp;lt;experiment&amp;gt;/plots/&lt;/code&gt; instead of the correct
&lt;code&gt;plots/&amp;lt;domain&amp;gt;/&amp;lt;model&amp;gt;/&amp;lt;period&amp;gt;/&amp;lt;type&amp;gt;/&lt;/code&gt; path.  Canonical files are left
untouched.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Simulation List</title>
      <link>https://bolding-bruggeman.com/oceanicu_3d/guides/simulation-list/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://bolding-bruggeman.com/oceanicu_3d/guides/simulation-list/</guid>
      <description>&lt;h1 id=&#34;simulation-list-guide&#34;&gt;Simulation List Guide&lt;/h1&gt;
&lt;h2 id=&#34;overview&#34;&gt;Overview&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;simulation-list&lt;/code&gt; manages the experiment registry — a SQLite database that
tracks every analysis run, its parameters, and its status.  The registry is
used by &lt;code&gt;ocean-reporting&lt;/code&gt; to populate the Hugo site and by &lt;code&gt;update-from-remote&lt;/code&gt;
after each sync.&lt;/p&gt;
&lt;p&gt;The registry uses a two-step write pattern to avoid race conditions when
multiple analysis scripts run in parallel:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Each script writes a small staging YAML file under &lt;code&gt;analyses/staging/&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;simulation-list merge&lt;/code&gt; atomically flushes all staging files into the DB.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;subcommands&#34;&gt;Subcommands&lt;/h2&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Show DB contents and pending staging files&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;simulation-list status &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;--base-dir DIR&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Flush staging → DB&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;simulation-list merge  &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;--base-dir DIR&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Export DB to a human-readable YAML snapshot&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;simulation-list to-yaml out.yaml &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;--base-dir DIR&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Migrate a legacy YAML registry into the DB&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;simulation-list to-sqlite old_registry.yaml &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;--base-dir DIR&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;--base-dir&lt;/code&gt; defaults to &lt;code&gt;./analyses&lt;/code&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Statistics Database</title>
      <link>https://bolding-bruggeman.com/oceanicu_3d/guides/statistics-db/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://bolding-bruggeman.com/oceanicu_3d/guides/statistics-db/</guid>
      <description>&lt;h1 id=&#34;statistics-database-guide&#34;&gt;Statistics Database Guide&lt;/h1&gt;
&lt;h2 id=&#34;overview&#34;&gt;Overview&lt;/h2&gt;
&lt;p&gt;Every analysis script writes its results to human-readable TXT/CSV files inside
the &lt;code&gt;analyses/&lt;/code&gt; tree &lt;strong&gt;and&lt;/strong&gt; records the same numbers in a SQLite database at
&lt;code&gt;analyses/statistics.db&lt;/code&gt;.  The database makes it easy to compare experiments,
track how metrics change over time, and query across areas and variables without
parsing text files.&lt;/p&gt;
&lt;p&gt;The database is managed by &lt;code&gt;lib/stats_db.py&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&#34;tables&#34;&gt;Tables&lt;/h2&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Table&lt;/th&gt;
          &lt;th&gt;Purpose&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;statistics&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Core metrics from 2-D gridded, 3-D, and profile analyses&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;monthly_statistics&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Month-by-month breakdown (child of &lt;code&gt;statistics&lt;/code&gt;)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;tidal_statistics&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Tidal constituent summary aggregated across stations&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;mle_rankings&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;MLE cross-experiment ranking rows&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;bc_statistics&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Bias-correction calibration and future-period metrics&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;statistics&#34;&gt;statistics&lt;/h3&gt;
&lt;p&gt;One row per &lt;em&gt;(area, experiment, variable, period, layer, model, obs_source,
depth_label)&lt;/em&gt; combination.  A &lt;code&gt;UNIQUE&lt;/code&gt; constraint on those eight columns means
re-running an analysis &lt;strong&gt;upserts&lt;/strong&gt; the row rather than duplicating it.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Reporting</title>
      <link>https://bolding-bruggeman.com/oceanicu_3d/guides/reporting/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://bolding-bruggeman.com/oceanicu_3d/guides/reporting/</guid>
      <description>&lt;h1 id=&#34;reporting-guide&#34;&gt;Reporting Guide&lt;/h1&gt;
&lt;h2 id=&#34;overview&#34;&gt;Overview&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;ocean-reporting&lt;/code&gt; reads the &lt;code&gt;analyses/&lt;/code&gt; directory tree produced by the validation
scripts and generates two types of output:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Hugo Markdown pages&lt;/strong&gt; — a structured static website showing plots, statistics
tables, and summary text for every area and experiment.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PDF report&lt;/strong&gt; — a self-contained document with the same content, built with
reportlab.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Both outputs can be produced in a single run by combining &lt;code&gt;--hugo&lt;/code&gt; and &lt;code&gt;--pdf&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&#34;prerequisite-the-analyses-tree&#34;&gt;Prerequisite: the analyses/ tree&lt;/h2&gt;
&lt;p&gt;All validation scripts write to a canonical tree under &lt;code&gt;output.analyses_dir&lt;/code&gt;
(resolved from &lt;code&gt;OCEANICU_ANALYSES_FOLDER&lt;/code&gt; — see the tidal/gridded guides).
The exact layout is defined in &lt;code&gt;lib/layout.py&lt;/code&gt;:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Hugo Deployment</title>
      <link>https://bolding-bruggeman.com/oceanicu_3d/guides/hugo-deployment/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://bolding-bruggeman.com/oceanicu_3d/guides/hugo-deployment/</guid>
      <description>&lt;h1 id=&#34;hugo-deployment-guide&#34;&gt;Hugo Deployment Guide&lt;/h1&gt;
&lt;h2 id=&#34;overview&#34;&gt;Overview&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;reporting.md&#34;&gt;Reporting&lt;/a&gt; explains &lt;code&gt;ocean-reporting&lt;/code&gt;&amp;rsquo;s options and the
&lt;code&gt;analyses/&lt;/code&gt; tree it reads. This guide is about what happens &lt;em&gt;after&lt;/em&gt; that:
getting the generated Hugo content actually live, and the real mistakes
that have already happened doing it.&lt;/p&gt;
&lt;p&gt;There are two entry points to the exact same underlying code — pick
whichever fits the situation:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&#34;update-from-remote.md&#34;&gt;update-from-remote&lt;/a&gt;&lt;/strong&gt; — sync a remote
cluster&amp;rsquo;s &lt;code&gt;analyses/&lt;/code&gt; down, merge/scan into the DB, then report +
deploy, all in one command. Right when there&amp;rsquo;s fresh data to pull in
first.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Manual two-step&lt;/strong&gt; (used directly against data that&amp;rsquo;s already local,
e.g. on the reporting host itself): the calling project&amp;rsquo;s own
&lt;code&gt;regenerate_hugo.py --apply&lt;/code&gt;, then this repo&amp;rsquo;s own &lt;code&gt;deploy_ghpages.py --apply&lt;/code&gt;. Both relay over ssh to the reporting host automatically if
run from elsewhere. &lt;code&gt;regenerate_hugo.py&lt;/code&gt; isn&amp;rsquo;t part of this repo — it
lives in the site&amp;rsquo;s own repo (e.g. &lt;code&gt;oceanicu_3d/regenerate_hugo.py&lt;/code&gt;),
and its own &lt;code&gt;docs/web-regeneration.md&lt;/code&gt; has the full detail for that
side.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Either path ends up calling &lt;code&gt;cli.reporting:main&lt;/code&gt; (as &lt;code&gt;ocean-reporting&lt;/code&gt; in
one case, &lt;code&gt;python3 -m cli.reporting&lt;/code&gt; in the other) and this repo&amp;rsquo;s own
&lt;code&gt;deploy_ghpages.py&lt;/code&gt; directly. A bug or fix in &lt;code&gt;lib/reporting.py&lt;/code&gt; affects
both equally.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Regridding</title>
      <link>https://bolding-bruggeman.com/oceanicu_3d/guides/regridding/</link>
      <pubDate>Sat, 10 Oct 2026 00:00:00 +0000</pubDate>
      <guid>https://bolding-bruggeman.com/oceanicu_3d/guides/regridding/</guid>
      <description>&lt;h1 id=&#34;regridding-user-guide&#34;&gt;Regridding User Guide&lt;/h1&gt;
&lt;p&gt;&lt;code&gt;ocean_data.regridding&lt;/code&gt; provides xESMF-based regridding with automatic
weight-file caching, domain subsetting, and coordinate name normalisation.
The &lt;code&gt;regrid&lt;/code&gt; command (&lt;code&gt;cli/regrid.py&lt;/code&gt;) exposes the same functionality as a
command-line tool. ocean-post re-exports the same API from
&lt;code&gt;ocean_post.regridding&lt;/code&gt; for backward compatibility; import from
&lt;code&gt;ocean_data.regridding&lt;/code&gt; in new code.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;contents&#34;&gt;Contents&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&#34;#1-introduction&#34;&gt;Introduction&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#2-installation-and-setup&#34;&gt;Installation and setup&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#3-command-line-interface&#34;&gt;Command-line interface&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#31-basic-usage&#34;&gt;Basic usage&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#32-selecting-variables&#34;&gt;Selecting variables&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#33-choosing-the-regrid-method&#34;&gt;Choosing the regrid method&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#34-the---target-variable-flag&#34;&gt;The &amp;ndash;target-variable flag&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#35-weight-caching&#34;&gt;Weight caching&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#36-global-source-grids&#34;&gt;Global source grids&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#37-skipping-domain-subsetting&#34;&gt;Skipping domain subsetting&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#4-python-api&#34;&gt;Python API&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#41-regridmanager&#34;&gt;RegridManager&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#42-regrid&#34;&gt;.regrid()&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#43-subset_to_target_domain&#34;&gt;.subset_to_target_domain()&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#44-regrid_data&#34;&gt;regrid_data()&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#45-open_with_chunks&#34;&gt;open_with_chunks()&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#5-weight-caching&#34;&gt;Weight caching&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#6-regridding-methods&#34;&gt;Regridding methods&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#7-coordinate-name-handling&#34;&gt;Coordinate name handling&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#8-domain-subsetting&#34;&gt;Domain subsetting&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#9-unit-conversion&#34;&gt;Unit conversion&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#10-troubleshooting&#34;&gt;Troubleshooting&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id=&#34;1-introduction&#34;&gt;1. Introduction&lt;/h2&gt;
&lt;p&gt;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.&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
