multilayer_register_passive_tracer Subroutine

private 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.

Type Bound

multilayer_state_t

Arguments

Type IntentOptional 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

Calls

proc~~multilayer_register_passive_tracer~~CallsGraph proc~multilayer_register_passive_tracer multilayer_state_t%multilayer_register_passive_tracer error error proc~multilayer_register_passive_tracer->error proc~error_ring_push error_ring_push proc~multilayer_register_passive_tracer->proc~error_ring_push proc~tracer_init tracer_t%tracer_init proc~multilayer_register_passive_tracer->proc~tracer_init

Called by

proc~~multilayer_register_passive_tracer~~CalledByGraph proc~multilayer_register_passive_tracer multilayer_state_t%multilayer_register_passive_tracer proc~ocean_pseudo_salt_register ocean_pseudo_salt_register proc~ocean_pseudo_salt_register->proc~multilayer_register_passive_tracer proc~ocean_state_init ocean_state_t%ocean_state_init proc~ocean_state_init->proc~ocean_pseudo_salt_register proc~ocean_state_init_from_config ocean_state_t%ocean_state_init_from_config proc~ocean_state_init_from_config->proc~ocean_state_init proc~engine_setup engine_setup proc~engine_setup->proc~ocean_state_init_from_config proc~complete_ocean_create complete_ocean_create proc~complete_ocean_create->proc~engine_setup proc~driver_run_ocean driver_run_ocean proc~driver_run_ocean->proc~engine_setup proc~driver_validate driver_validate proc~driver_validate->proc~engine_setup

Variables

Type Visibility Attributes Name Initial
integer, private :: it
integer, private :: n_old
type(tracer_t), private, allocatable :: tmp(:)

Source Code

   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