subroutine register_ocean_tdrag(cfg, schema)
!! `&ocean_tdrag_nml`: ice-shelf TOP-drag selector + coefficients.
!! `form` enum mirrors `parse_tdrag_variant` in rdb_ocean_top_drag.
type(config_t), target, intent(in) :: cfg
type(nml_schema_t), intent(inout) :: schema
type(nml_group_t) :: g
real(wp), pointer :: pr
character(len=:), pointer :: ps
logical, pointer :: pl
g%name = "ocean_tdrag"
g%doc = "Ice-shelf top-drag selector + coefficients (mirror of &ocean_bdrag_nml)."
pl => cfg%ocean%tdrag%enable
call g%add(nml_logical("enable", pl, &
"Enable the ice-shelf top drag (requires "// &
"&ocean_cavity_dyn_nml enable)"))
ps => cfg%ocean%tdrag%form
call g%add(nml_enum("form", ps, "Top-drag variant", &
allowed=[character(len=9) :: "quadratic", "linear"]))
pr => cfg%ocean%tdrag%cd
call g%add(nml_real("cd", pr, &
"Quadratic top-drag coefficient (0 disables); must equal "// &
"&ocean_cavity_melt_nml cdrag_top when melt is on", &
min=0.0_wp))
pr => cfg%ocean%tdrag%r
call g%add(nml_real("r", pr, "Linear Rayleigh top-drag coefficient (0 disables)", &
units="1/s", min=0.0_wp))
pr => cfg%ocean%tdrag%htbl
call g%add(nml_real("htbl", pr, &
"Top-boundary-layer thickness for distributed drag "// &
"(0 = layer-nz only)", units="m", min=0.0_wp))
pr => cfg%ocean%tdrag%bg_vel
call g%add(nml_real("bg_vel", pr, &
"Background velocity floor in the quadratic top-drag speed", &
units="m/s", min=0.0_wp))
pr => cfg%ocean%tdrag%tbl_thick_min
call g%add(nml_real("tbl_thick_min", pr, &
"Minimum effective TBL thickness (0 = fall back to h_min)", &
units="m", min=0.0_wp))
pl => cfg%ocean%tdrag%implicit
call g%add(nml_logical("implicit", pl, &
"Backward-Euler top drag inside the drag kernel "// &
"(stable for thin top layers)"))
call schema%add_group(g)
end subroutine register_ocean_tdrag