rdb_ocean_set_tracer Function

public function rdb_ocean_set_tracer(c_handle, name, name_len, data, nx_p, ny_p, nz_p) result(status) bind(c, name="rdb_ocean_set_tracer")

Set the tracer named name to data (its own units — degC for temperature, PSU for salinity) on the physical interior. Verbatim the recovered ocean_set_tracer_impl sequence, generalised from hardcoded S/T to any registered tracer BY NAME: flush the windowed-advection accumulator -> refresh host (need the LIVE h_layer to form hTr = h_layer*value) -> mutate hTr on the physical interior -> narrow-push hTr -> recompute rho_layer (pulled back to host so it stays authoritative). OCEAN_STATUS_ERR_NOT_FOUND if no registered tracer matches.

Arguments

Type IntentOptional Attributes Name
type(c_ptr), intent(in), value :: c_handle
character(kind=c_char, len=1), intent(in) :: name(name_len)
integer(kind=c_int), intent(in), value :: name_len
real(kind=c_double), intent(in) :: data(nx_p,ny_p,nz_p)
integer(kind=c_int), intent(in), value :: nx_p
integer(kind=c_int), intent(in), value :: ny_p
integer(kind=c_int), intent(in), value :: nz_p

Return Value integer(kind=c_int)


Calls

proc~~rdb_ocean_set_tracer~~CallsGraph proc~rdb_ocean_set_tracer rdb_ocean_set_tracer proc~c_to_f_string c_to_f_string proc~rdb_ocean_set_tracer->proc~c_to_f_string proc~fail fail proc~rdb_ocean_set_tracer->proc~fail proc~ocean_dyn_flush_tracer_window ocean_dyn_flush_tracer_window proc~rdb_ocean_set_tracer->proc~ocean_dyn_flush_tracer_window proc~ocean_eos_compute ocean_eos_compute proc~rdb_ocean_set_tracer->proc~ocean_eos_compute proc~ocean_handle_refresh_host ocean_handle_refresh_host proc~rdb_ocean_set_tracer->proc~ocean_handle_refresh_host proc~resolve_ocean resolve_ocean proc~rdb_ocean_set_tracer->proc~resolve_ocean proc~shape_matches_interior shape_matches_interior proc~rdb_ocean_set_tracer->proc~shape_matches_interior proc~tracer_index_by_name tracer_index_by_name proc~rdb_ocean_set_tracer->proc~tracer_index_by_name error error proc~fail->error proc~error_ring_push error_ring_push proc~fail->proc~error_ring_push proc~continuity_tracer_drain continuity_tracer_drain proc~ocean_dyn_flush_tracer_window->proc~continuity_tracer_drain proc~eos_compute_arrays eos_compute_arrays proc~ocean_eos_compute->proc~eos_compute_arrays proc~handle_check handle_check proc~resolve_ocean->proc~handle_check proc~drain_avail_limit drain_avail_limit proc~continuity_tracer_drain->proc~drain_avail_limit proc~drain_avail_scale_x drain_avail_scale_x proc~continuity_tracer_drain->proc~drain_avail_scale_x proc~drain_avail_scale_y drain_avail_scale_y proc~continuity_tracer_drain->proc~drain_avail_scale_y proc~drain_copy_3d drain_copy_3d proc~continuity_tracer_drain->proc~drain_copy_3d proc~drain_fill_conc drain_fill_conc proc~continuity_tracer_drain->proc~drain_fill_conc proc~drain_limit_x drain_limit_x proc~continuity_tracer_drain->proc~drain_limit_x proc~drain_limit_y drain_limit_y proc~continuity_tracer_drain->proc~drain_limit_y proc~drain_parabola_x drain_parabola_x proc~continuity_tracer_drain->proc~drain_parabola_x proc~drain_parabola_y drain_parabola_y proc~continuity_tracer_drain->proc~drain_parabola_y proc~drain_reconstruct_hprev drain_reconstruct_hprev proc~continuity_tracer_drain->proc~drain_reconstruct_hprev proc~drain_rescale_htr drain_rescale_hTr proc~continuity_tracer_drain->proc~drain_rescale_htr proc~drain_rescale_htr_budget drain_rescale_hTr_budget proc~continuity_tracer_drain->proc~drain_rescale_htr_budget proc~drain_subtract_3d drain_subtract_3d proc~continuity_tracer_drain->proc~drain_subtract_3d proc~drain_swept_flux_x drain_swept_flux_x proc~continuity_tracer_drain->proc~drain_swept_flux_x proc~drain_swept_flux_x_weno drain_swept_flux_x_weno proc~continuity_tracer_drain->proc~drain_swept_flux_x_weno proc~drain_swept_flux_y drain_swept_flux_y proc~continuity_tracer_drain->proc~drain_swept_flux_y proc~drain_swept_flux_y_weno drain_swept_flux_y_weno proc~continuity_tracer_drain->proc~drain_swept_flux_y_weno proc~drain_update_h_x drain_update_h_x proc~continuity_tracer_drain->proc~drain_update_h_x proc~drain_update_h_y drain_update_h_y proc~continuity_tracer_drain->proc~drain_update_h_y proc~drain_update_tracer_x drain_update_tracer_x proc~continuity_tracer_drain->proc~drain_update_tracer_x proc~drain_update_tracer_x_budget drain_update_tracer_x_budget proc~continuity_tracer_drain->proc~drain_update_tracer_x_budget proc~drain_update_tracer_y drain_update_tracer_y proc~continuity_tracer_drain->proc~drain_update_tracer_y proc~drain_update_tracer_y_budget drain_update_tracer_y_budget proc~continuity_tracer_drain->proc~drain_update_tracer_y_budget proc~drain_wrap_centre drain_wrap_centre proc~continuity_tracer_drain->proc~drain_wrap_centre proc~drain_wrap_face_x drain_wrap_face_x proc~continuity_tracer_drain->proc~drain_wrap_face_x proc~drain_wrap_face_y drain_wrap_face_y proc~continuity_tracer_drain->proc~drain_wrap_face_y proc~drain_zero_3d drain_zero_3d proc~continuity_tracer_drain->proc~drain_zero_3d proc~ocean_halo_is_decomposed_x ocean_halo_is_decomposed_x proc~continuity_tracer_drain->proc~ocean_halo_is_decomposed_x proc~ocean_halo_is_decomposed_y ocean_halo_is_decomposed_y proc~continuity_tracer_drain->proc~ocean_halo_is_decomposed_y reduce reduce proc~continuity_tracer_drain->reduce proc~eos_linear_impl eos_linear_impl proc~eos_compute_arrays->proc~eos_linear_impl proc~eos_roquet_spv_impl eos_roquet_spv_impl proc~eos_compute_arrays->proc~eos_roquet_spv_impl proc~eos_wright_impl eos_wright_impl proc~eos_compute_arrays->proc~eos_wright_impl local local proc~drain_avail_limit->local proc~drain_avail_scale_x->local proc~drain_avail_scale_y->local proc~drain_limit_x->local proc~drain_limit_y->local proc~drain_parabola_x->local proc~ppm_cell_limiter ppm_cell_limiter proc~drain_parabola_x->proc~ppm_cell_limiter proc~ppm_limited_slope ppm_limited_slope proc~drain_parabola_x->proc~ppm_limited_slope proc~ppm_mirror_h ppm_mirror_h proc~drain_parabola_x->proc~ppm_mirror_h proc~drain_parabola_y->local proc~drain_parabola_y->proc~ppm_cell_limiter proc~drain_parabola_y->proc~ppm_limited_slope proc~drain_parabola_y->proc~ppm_mirror_h proc~drain_reconstruct_hprev->local proc~drain_rescale_htr_budget->local proc~drain_swept_flux_x->local proc~drain_swept_flux_x_weno->local proc~weno_face_conc_x weno_face_conc_x proc~drain_swept_flux_x_weno->proc~weno_face_conc_x proc~drain_swept_flux_y->local proc~drain_swept_flux_y_weno->local proc~weno_face_conc_y weno_face_conc_y proc~drain_swept_flux_y_weno->proc~weno_face_conc_y interface~fold_north_centre fold_north_centre proc~drain_wrap_centre->interface~fold_north_centre proc~ocean_periodic_wrap_centre_3d ocean_periodic_wrap_centre_3d proc~drain_wrap_centre->proc~ocean_periodic_wrap_centre_3d interface~fold_north_u_face fold_north_u_face proc~drain_wrap_face_x->interface~fold_north_u_face proc~ocean_periodic_wrap_face_x_3d ocean_periodic_wrap_face_x_3d proc~drain_wrap_face_x->proc~ocean_periodic_wrap_face_x_3d interface~fold_north_v_face fold_north_v_face proc~drain_wrap_face_y->interface~fold_north_v_face proc~ocean_periodic_wrap_face_y_3d ocean_periodic_wrap_face_y_3d proc~drain_wrap_face_y->proc~ocean_periodic_wrap_face_y_3d proc~eos_linear_impl->local proc~eos_roquet_spv_impl->local proc~roquet_spv_value roquet_spv_value proc~eos_roquet_spv_impl->proc~roquet_spv_value proc~eos_wright_impl->local proc~fold_north_centre_2d fold_north_centre_2d interface~fold_north_centre->proc~fold_north_centre_2d proc~fold_north_centre_3d fold_north_centre_3d interface~fold_north_centre->proc~fold_north_centre_3d proc~fold_north_u_face_2d fold_north_u_face_2d interface~fold_north_u_face->proc~fold_north_u_face_2d proc~fold_north_u_face_3d fold_north_u_face_3d interface~fold_north_u_face->proc~fold_north_u_face_3d proc~fold_north_v_face_2d fold_north_v_face_2d interface~fold_north_v_face->proc~fold_north_v_face_2d proc~fold_north_v_face_3d fold_north_v_face_3d interface~fold_north_v_face->proc~fold_north_v_face_3d rdb_roq_spv_p rdb_roq_spv_p proc~roquet_spv_value->rdb_roq_spv_p rdb_roq_ts_coeffs rdb_roq_ts_coeffs proc~roquet_spv_value->rdb_roq_ts_coeffs proc~weno_face_conc_x->proc~ppm_mirror_h proc~plm_face_swept plm_face_swept proc~weno_face_conc_x->proc~plm_face_swept proc~recon_rung_for_face recon_rung_for_face proc~weno_face_conc_x->proc~recon_rung_for_face proc~weno5_face_swept weno5_face_swept proc~weno_face_conc_x->proc~weno5_face_swept proc~weno7_face_swept weno7_face_swept proc~weno_face_conc_x->proc~weno7_face_swept proc~weno9_face_swept weno9_face_swept proc~weno_face_conc_x->proc~weno9_face_swept proc~weno_face_conc_y->proc~ppm_mirror_h proc~weno_face_conc_y->proc~plm_face_swept proc~weno_face_conc_y->proc~recon_rung_for_face proc~weno_face_conc_y->proc~weno5_face_swept proc~weno_face_conc_y->proc~weno7_face_swept proc~weno_face_conc_y->proc~weno9_face_swept

Variables

Type Visibility Attributes Name Initial
character(len=:), private, allocatable :: fname
type(ocean_handle_t), private, pointer :: h
integer, private :: i
integer, private :: ierr_local
integer, private :: it
integer, private :: j
integer, private :: k
integer, private :: ng

Source Code

   function rdb_ocean_set_tracer(c_handle, name, name_len, data, nx_p, ny_p, nz_p) &
      result(status) bind(c, name="rdb_ocean_set_tracer")
      !! Set the tracer named `name` to `data` (its own units — degC for
      !! temperature, PSU for salinity) on the physical interior. Verbatim
      !! the recovered `ocean_set_tracer_impl` sequence, generalised from
      !! hardcoded S/T to any registered tracer BY NAME: flush the
      !! windowed-advection accumulator -> refresh host (need the LIVE
      !! `h_layer` to form `hTr = h_layer*value`) -> mutate `hTr` on the
      !! physical interior -> narrow-push `hTr` -> recompute `rho_layer`
      !! (pulled back to host so it stays authoritative).
      !! `OCEAN_STATUS_ERR_NOT_FOUND` if no registered tracer matches.
      type(c_ptr), intent(in), value :: c_handle
      integer(c_int), intent(in), value :: name_len
      character(kind=c_char), intent(in) :: name(name_len)
      integer(c_int), intent(in), value :: nx_p, ny_p, nz_p
      real(c_double), intent(in) :: data(nx_p, ny_p, nz_p)
      integer(c_int) :: status

      type(ocean_handle_t), pointer :: h
      character(len=:), allocatable :: fname
      integer :: ng, i, j, k, it, ierr_local

      status = resolve_ocean(c_handle, h)
      if (status /= OCEAN_STATUS_OK) return
      if (.not. shape_matches_interior(h, nx_p, ny_p, nz_p)) then
         call fail("rdb_ocean_set_tracer: shape mismatch against the physical interior", &
                   ierr_local, OCEAN_STATUS_ERR_BAD_SHAPE)
         status = int(ierr_local, c_int)
         return
      end if

      call c_to_f_string(name, name_len, fname)
      it = tracer_index_by_name(h, fname)
      if (it == 0) then
         call fail("rdb_ocean_set_tracer: no tracer named '"//fname//"'", &
                   ierr_local, OCEAN_STATUS_ERR_NOT_FOUND)
         status = int(ierr_local, c_int)
         return
      end if

      ! Drain any open windowed tracer-advection accumulation BEFORE
      ! reading/overwriting the tracer, so pending transport (accumulated
      ! against the OLD field) is never later applied to the NEW one.
      ! Hard no-op at dt_tracer_advect_ratio<=1 (default; bit-identical).
      call ocean_dyn_flush_tracer_window(h%grid, h%state%metrics, h%state%dyn, &
                                         h%state%continuity, h%state%multilayer, &
                                         bc=h%state%bc)
      call ocean_handle_refresh_host(h)

      ng = h%grid%nghost
      associate (hl => h%state%multilayer%h_layer, htr => h%state%multilayer%tracers(it)%hTr)
         do k = 1, nz_p
            do j = 1, ny_p
               do i = 1, nx_p
                  htr(ng + i, ng + j, k) = hl(ng + i, ng + j, k)*real(data(i, j, k), wp)
               end do
            end do
         end do
         !$acc update device(htr)
      end associate
      call ocean_eos_compute(h%state%eos, h%state%multilayer)
      associate (rl => h%state%multilayer%rho_layer)
         !$acc update self(rl)
      end associate
      h%host_is_current = .true.
      status = int(OCEAN_STATUS_OK, c_int)
   end function rdb_ocean_set_tracer