rdb_ocean_get_tracer_ptr Function

public function rdb_ocean_get_tracer_ptr(c_handle, name, name_len, ptr, nx, ny, nz, gen) result(status) bind(c, name="rdb_ocean_get_tracer_ptr")

Raw h*Tr store (NOT concentration — D3.2) for the tracer named name, by NAME (never index — the recovered code had no tracer accessors, and index comparison is already the wrong idiom in the Fortran itself). OCEAN_STATUS_ERR_NOT_FOUND if no registered tracer matches. Shape (nx_total, ny_total, nz_ml).

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
type(c_ptr), intent(out) :: ptr
integer(kind=c_int), intent(out) :: nx
integer(kind=c_int), intent(out) :: ny
integer(kind=c_int), intent(out) :: nz
integer(kind=c_int), intent(out) :: gen

Return Value integer(kind=c_int)


Calls

proc~~rdb_ocean_get_tracer_ptr~~CallsGraph proc~rdb_ocean_get_tracer_ptr rdb_ocean_get_tracer_ptr proc~c_to_f_string c_to_f_string proc~rdb_ocean_get_tracer_ptr->proc~c_to_f_string proc~fail fail proc~rdb_ocean_get_tracer_ptr->proc~fail proc~fill_getter_3d fill_getter_3d proc~rdb_ocean_get_tracer_ptr->proc~fill_getter_3d proc~resolve_ocean resolve_ocean proc~rdb_ocean_get_tracer_ptr->proc~resolve_ocean proc~tracer_index_by_name tracer_index_by_name proc~rdb_ocean_get_tracer_ptr->proc~tracer_index_by_name error error proc~fail->error proc~error_ring_push error_ring_push proc~fail->proc~error_ring_push proc~handle_check handle_check proc~resolve_ocean->proc~handle_check

Variables

Type Visibility Attributes Name Initial
character(len=:), private, allocatable :: fname
integer, private :: found
type(ocean_handle_t), private, pointer :: h
integer, private :: ierr_local
integer, private :: it
real(kind=wp), private, pointer :: tmp(:,:,:)

Source Code

   function rdb_ocean_get_tracer_ptr(c_handle, name, name_len, ptr, nx, ny, nz, gen) &
      result(status) bind(c, name="rdb_ocean_get_tracer_ptr")
      !! Raw `h*Tr` store (NOT concentration — D3.2) for the tracer named
      !! `name`, by NAME (never index — the recovered code had no tracer
      !! accessors, and index comparison is already the wrong idiom in the
      !! Fortran itself). `OCEAN_STATUS_ERR_NOT_FOUND` if no registered
      !! tracer matches. Shape `(nx_total, ny_total, nz_ml)`.
      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)
      type(c_ptr), intent(out) :: ptr
      integer(c_int), intent(out) :: nx, ny, nz, gen
      integer(c_int) :: status

      type(ocean_handle_t), pointer :: h
      real(wp), pointer :: tmp(:, :, :)
      character(len=:), allocatable :: fname
      integer :: it, found, ierr_local

      ptr = c_null_ptr
      nx = 0
      ny = 0
      nz = 0
      gen = 0
      status = resolve_ocean(c_handle, h)
      if (status /= OCEAN_STATUS_OK) return

      call c_to_f_string(name, name_len, fname)
      found = tracer_index_by_name(h, fname)
      if (found == 0) then
         call fail("rdb_ocean_get_tracer_ptr: no tracer named '"//fname//"'", &
                   ierr_local, OCEAN_STATUS_ERR_NOT_FOUND)
         status = int(ierr_local, c_int)
         return
      end if
      tmp => h%state%multilayer%tracers(found)%hTr
      call fill_getter_3d(ptr, nx, ny, nz, gen, tmp, h%state%dyn%outer_step_count)
   end function rdb_ocean_get_tracer_ptr