Append a passive tracer (eos_coeff = 0, budget_id = NONE) to
the registry, growing tracers(:) past the default S/T[/age] set.
Returns its slot in idx, or idx = 0 on refusal (registry not
init’d, or locked by enter_data). MUST be called after init
and BEFORE enter_data — and, on the ocean path, before
ocean_bc_state_init sizes bc%n_tracers. Caller populates
hTr once layer thicknesses exist, and may set
tracers(idx)%standard_name / the pipeline opt-outs directly
(public components). S/T/age keep their indices.
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| class(multilayer_state_t), | intent(inout) | :: | this | |||
| type(hgrid_t), | intent(in) | :: | grid | |||
| character(len=*), | intent(in) | :: | name | |||
| character(len=*), | intent(in) | :: | units | |||
| character(len=*), | intent(in) | :: | long_name | |||
| integer, | intent(out) | :: | idx |
| Type | Visibility | Attributes | Name | Initial | |||
|---|---|---|---|---|---|---|---|
| integer, | private | :: | it | ||||
| integer, | private | :: | n_old | ||||
| type(tracer_t), | private, | allocatable | :: | tmp(:) |
subroutine multilayer_register_passive_tracer(this, grid, name, units, & long_name, idx) !! Append a passive tracer (`eos_coeff = 0`, `budget_id = NONE`) to !! the registry, growing `tracers(:)` past the default S/T[/age] set. !! Returns its slot in `idx`, or `idx = 0` on refusal (registry not !! init'd, or locked by `enter_data`). MUST be called after `init` !! and BEFORE `enter_data` — and, on the ocean path, before !! `ocean_bc_state_init` sizes `bc%n_tracers`. Caller populates !! `hTr` once layer thicknesses exist, and may set !! `tracers(idx)%standard_name` / the pipeline opt-outs directly !! (public components). S/T/age keep their indices. class(multilayer_state_t), intent(inout) :: this type(hgrid_t), intent(in) :: grid character(len=*), intent(in) :: name character(len=*), intent(in) :: units character(len=*), intent(in) :: long_name integer, intent(out) :: idx type(tracer_t), allocatable :: tmp(:) integer :: n_old, it idx = 0 if (.not. this%is_init) then call error_ring_push("multilayer_state: register_passive_tracer("// & trim(name)//") refused — registry not initialised "// & "(call after init())") call global_logger%error("multilayer_state: register_passive_tracer("// & trim(name)//") refused — registry not initialised "// & "(call after init())") return end if if (this%registry_locked) then call error_ring_push("multilayer_state: register_passive_tracer("// & trim(name)//") refused — registry locked by "// & "enter_data (a slot appended now would never be "// & "device-mapped on the mem:separate GPU build)") call global_logger%error("multilayer_state: register_passive_tracer("// & trim(name)//") refused — registry locked by "// & "enter_data (a slot appended now would never be "// & "device-mapped on the mem:separate GPU build)") return end if n_old = size(this%tracers) call move_alloc(this%tracers, tmp) allocate (this%tracers(n_old + 1)) ! Deep-copy the existing tracers (intrinsic assignment reallocates ! the allocatable hTr / hTr0 components and copies their data). do it = 1, n_old this%tracers(it) = tmp(it) end do it = n_old + 1 call this%tracers(it)%init(grid, this%nz_ml) this%tracers(it)%name = trim(name) this%tracers(it)%long_name = trim(long_name) this%tracers(it)%units = trim(units) this%tracers(it)%standard_name = "" this%tracers(it)%eos_coeff = 0.0_wp this%tracers(it)%eos_ref = 0.0_wp this%tracers(it)%budget_id = TRACER_BUDGET_NONE idx = it end subroutine multilayer_register_passive_tracer