subroutine register_ocean_sponge(cfg, schema)
!! `&ocean_sponge_nml`: the map-driven sponge (PR-23). Default
!! `enable = .false.` ⇒ the legacy `&ocean_bc_nml` band kernels run
!! unchanged ⇒ bit-identical. No `damp_max` / `idamp_file` / `*_var`
!! keys in v1 — those validate and do nothing until PR-23b adds their
!! consumer (CLAUDE.md trap class "dead knobs").
type(config_t), target, intent(in) :: cfg
type(nml_schema_t), intent(inout) :: schema
type(nml_group_t) :: g
logical, pointer :: pl
real(wp), pointer :: pr
integer, pointer :: pi
character(len=:), pointer :: ps
g%name = "ocean_sponge"
g%doc = "Map-driven sponge: per-cell Idamp + 3-D reference state (PR-23)."
pl => cfg%ocean%sponge%enable
call g%add(nml_logical("enable", pl, &
"Master switch (default off; legacy band kernels run when off)"))
ps => cfg%ocean%sponge%damp_source
call g%add(nml_enum("damp_source", ps, &
"How idamp_h/u/v are filled", &
allowed=[character(len=4) :: "band", "file"]))
ps => cfg%ocean%sponge%target_source
call g%add(nml_enum("target_source", ps, &
"Reference-state source", &
allowed=[character(len=8) :: "ic", "linear_z", "file"]))
ps => cfg%ocean%sponge%ramp
call g%add(nml_enum("ramp", ps, &
"Band ramp shape from the sponge wall inward "// &
"('linear' is ISOMIP+ Eq. 20)", &
allowed=[character(len=6) :: "cosine", "linear"]))
pr => cfg%ocean%sponge%lin_t_ref
call g%add(nml_real("lin_t_ref", pr, &
"target_source='linear_z': T at the z = 0 datum", units="degC"))
pr => cfg%ocean%sponge%lin_dt_dz
call g%add(nml_real("lin_dt_dz", pr, &
"target_source='linear_z': dT/dz, z positive UP "// &
"(stable => > 0)", units="degC/m"))
pr => cfg%ocean%sponge%lin_s_ref
call g%add(nml_real("lin_s_ref", pr, &
"target_source='linear_z': S at the z = 0 datum", units="PSU"))
pr => cfg%ocean%sponge%lin_ds_dz
call g%add(nml_real("lin_ds_dz", pr, &
"target_source='linear_z': dS/dz, z positive UP "// &
"(stable => < 0)", units="PSU/m"))
pl => cfg%ocean%sponge%relax_uv
call g%add(nml_logical("relax_uv", pl, &
"Relax u/v toward u_ref/v_ref"))
pl => cfg%ocean%sponge%relax_tracers
call g%add(nml_logical("relax_tracers", pl, &
"Relax every registered tracer toward its 3-D reference field"))
pl => cfg%ocean%sponge%relax_h
call g%add(nml_logical("relax_h", pl, &
"Interior-interface thickness damping (NOT IMPLEMENTED in v1 — "// &
"deferred to PR-23b, requires vcoord_type='lagrangian')"))
pi => cfg%ocean%sponge%west_width
call g%add(nml_int("west_width", pi, &
"Per-edge band-width override, cells (<0 => inherit "// &
"&ocean_bc_nml sponge_width)"))
pi => cfg%ocean%sponge%east_width
call g%add(nml_int("east_width", pi, "as west_width"))
pi => cfg%ocean%sponge%south_width
call g%add(nml_int("south_width", pi, "as west_width"))
pi => cfg%ocean%sponge%north_width
call g%add(nml_int("north_width", pi, "as west_width"))
pr => cfg%ocean%sponge%west_strength
call g%add(nml_real("west_strength", pr, &
"Per-edge peak relaxation-rate override (<0 => inherit "// &
"&ocean_bc_nml sponge_strength)", units="1/s"))
pr => cfg%ocean%sponge%east_strength
call g%add(nml_real("east_strength", pr, "as west_strength", units="1/s"))
pr => cfg%ocean%sponge%south_strength
call g%add(nml_real("south_strength", pr, "as west_strength", units="1/s"))
pr => cfg%ocean%sponge%north_strength
call g%add(nml_real("north_strength", pr, "as west_strength", units="1/s"))
call schema%add_group(g)
end subroutine register_ocean_sponge