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