Pseudo-salt (Shao 2016): a passive tracer seeded to salinity’s
initial condition and given exactly the operators salinity
receives that the registry does NOT deliver automatically — the
surface salt flux and the KPP/EPBL non-local counter-gradient
gamma_s (both mirrored in-place in the kernels that own them,
rdb_ocean_surface_flux / rdb_ocean_vmix — this module adds no
new dyn-step call site). Every other operator (advection, ALE
remap, vertical/horizontal diffusion, vertical exchange, halo,
sponge, OBC) already rides the generic tracer registry, so
pseudo-salt receives it “for free” the moment it is registered.
The deviation D = pseudo_salt - S is a direct, measured proxy
for how far the passive-tracer transport path has drifted from
the active-tracer (salinity) path — an architectural claim turned
into a number. Reference: Shao, A. (2016), MOM6
pseudo_salt_tracer.F90; the idea is standard practice in
offline/online transport verification and carries no separate
citation in MOM6 either.
Excluded by design (fail-loud at configure, rdb_config
validate_config) because Roundabout has no mirror for them and an
un-mirrored salinity source would make D measure that source
instead of the passive-path error: SSS piston restoring
(&ocean_restore_nml enable_restore_salt) and sea-ice frazil /
basal salt exchange (&ocean_ice_nml enable).
.true. iff pseudo-salt is enabled alongside the sea-ice
model — frazil / basal salt exchange are un-mirrored salinity
sources (rdb_ice_frazil.F90, rdb_ice_frazil_uptake.F90,
rdb_ice_basal_flux.F90). Drives a configure-time fail-loud
abort.
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| logical, | intent(in) | :: | enable_ps | |||
| logical, | intent(in) | :: | enable_ice |
.true. iff pseudo-salt is enabled alongside SSS piston
restoring — an un-mirrored salinity source
(rdb_ocean_surface_flux.F90 restore branch) that would make
the deviation diagnostic measure the restoring term instead of
the passive-transport-path error. Drives a configure-time
fail-loud abort.
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| logical, | intent(in) | :: | enable_ps | |||
| logical, | intent(in) | :: | enable_restore_salt |
.true. iff pseudo-salt is enabled with thermodynamics off.
NOT a hard error — pseudo-salt still measures pure transport,
a legitimate use — but the caller should warn: without
thermodynamics, the tracer never receives the surface salt
flux / KPP nonlocal mirrors, so D degenerates to a pure
advection/diffusion probe.
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| logical, | intent(in) | :: | enable_ps | |||
| logical, | intent(in) | :: | enable_thermodynamics |
Diagnostic helper: D(i,j,k) = hTr_ps/h - hTr_s/h, i.e. the
pseudo-salt concentration minus the salinity concentration.
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| real(kind=wp), | intent(in) | :: | h_layer(nx,ny,nz) | |||
| real(kind=wp), | intent(in) | :: | hTr_ps(nx,ny,nz) | |||
| real(kind=wp), | intent(in) | :: | hTr_s(nx,ny,nz) | |||
| real(kind=wp), | intent(inout) | :: | buf(nx,ny,nz) | |||
| integer, | intent(in) | :: | nx | |||
| integer, | intent(in) | :: | ny | |||
| integer, | intent(in) | :: | nz | |||
| real(kind=wp), | intent(in) | :: | missing |
Value written on a vanished layer (the diagnostics’ NaN). |
Setup-time entry point: registers the “pseudo_salt” passive
tracer (name/units/long_name copied verbatim from Shao 2016)
and records its slot on ms%idx_pseudo_salt. MUST be called
after ms%init and before enter_data — and, on the ocean
path, before ocean_bc_state_init sizes bc%n_tracers (the
register_passive_tracer contract). error stops on
refusal (mirrors rdb_state.F90’s treatment of a fatal setup
misconfiguration — a caller that reaches here has already
decided to register, so a silent no-op would be worse than a
loud abort).
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| type(multilayer_state_t), | intent(inout) | :: | ms | |||
| type(hgrid_t), | intent(in) | :: | grid |
Seed hTr(idx_pseudo_salt) = hTr(idx_salinity) over the FULL
array shape (nx_total, ny_total, nz_ml) — ghosts included,
matching MOM6’s isd:ied, jsd:jed seed (§4 of the plan). A
halved ghost band would make the deviation diagnostic non-zero
at the very first halo exchange, before any real transport has
run. Self-gates on either index being unregistered. Must run
AFTER every write to salinity’s initial condition (analytical
IC, then any z-file overlay) and BEFORE ocean_state_enter_data.
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| type(multilayer_state_t), | intent(inout) | :: | ms |