data_input_read_slab_impl Subroutine

private subroutine data_input_read_slab_impl(fld, rec, into_f1)

Host-ONLY NetCDF slab read for file record rec -> fld%f0 (default) or fld%f1 (into_f1 = .true.), applying scale/add_offset once at read. Uses the module-level host workspace (registration/bracket-advance-time only — never a per-step allocation). Deliberately carries NO !$acc directive: called both before enter_data (STATIC field, at registration) and after it (LINEAR/CYCLIC bracket advance) — the caller pushes to the device itself, only when that is actually correct (data_input_refresh_brackets).

Arguments

Type IntentOptional Attributes Name
type(data_input_field_t), intent(inout) :: fld
integer, intent(in) :: rec
logical, intent(in), optional :: into_f1

Calls

proc~~data_input_read_slab_impl~~CallsGraph proc~data_input_read_slab_impl data_input_read_slab_impl proc~data_input_workspace_ensure data_input_workspace_ensure proc~data_input_read_slab_impl->proc~data_input_workspace_ensure proc~nc_get_var_slab_3d nc_get_var_slab_3d proc~data_input_read_slab_impl->proc~nc_get_var_slab_3d nf90_get_var nf90_get_var proc~nc_get_var_slab_3d->nf90_get_var proc~nc_check nc_check proc~nc_get_var_slab_3d->proc~nc_check nf90_strerror nf90_strerror proc~nc_check->nf90_strerror proc~fail fail proc~nc_check->proc~fail error error proc~fail->error proc~error_ring_push error_ring_push proc~fail->proc~error_ring_push

Called by

proc~~data_input_read_slab_impl~~CalledByGraph proc~data_input_read_slab_impl data_input_read_slab_impl proc~data_input_refresh_brackets data_input_refresh_brackets proc~data_input_refresh_brackets->proc~data_input_read_slab_impl proc~register_common register_common proc~register_common->proc~data_input_read_slab_impl proc~ocean_data_input_register_2d ocean_data_input_register_2d proc~ocean_data_input_register_2d->proc~register_common proc~ocean_data_input_register_3d ocean_data_input_register_3d proc~ocean_data_input_register_3d->proc~register_common proc~ocean_data_input_register_segment_2d ocean_data_input_register_segment_2d proc~ocean_data_input_register_segment_2d->proc~register_common proc~ocean_data_input_register_segment_3d ocean_data_input_register_segment_3d proc~ocean_data_input_register_segment_3d->proc~register_common proc~ocean_data_input_update_all ocean_data_input_update_all proc~ocean_data_input_update_all->proc~data_input_refresh_brackets proc~engine_step engine_step proc~engine_step->proc~ocean_data_input_update_all proc~ocean_data_input_load_static_2d ocean_data_input_load_static_2d proc~ocean_data_input_load_static_2d->proc~ocean_data_input_register_2d proc~register_tag register_tag proc~register_tag->proc~ocean_data_input_register_2d proc~driver_run_ocean driver_run_ocean proc~driver_run_ocean->proc~engine_step proc~ocean_data_forcing_configure ocean_data_forcing_configure proc~ocean_data_forcing_configure->proc~register_tag proc~rdb_ocean_step rdb_ocean_step proc~rdb_ocean_step->proc~engine_step proc~seed_cavity_draft seed_cavity_draft proc~seed_cavity_draft->proc~ocean_data_input_load_static_2d proc~driver_run driver_run proc~driver_run->proc~driver_run_ocean proc~engine_setup engine_setup proc~engine_setup->proc~ocean_data_forcing_configure proc~ocean_state_seed_from_cfg ocean_state_seed_from_cfg proc~ocean_state_seed_from_cfg->proc~seed_cavity_draft

Variables

Type Visibility Attributes Name Initial
integer, private :: count4(4)
integer, private :: start4(4)
logical, private :: to_f1

Source Code

   subroutine data_input_read_slab_impl(fld, rec, into_f1)
      !! Host-ONLY NetCDF slab read for file record `rec` -> `fld%f0`
      !! (default) or `fld%f1` (`into_f1 = .true.`), applying
      !! `scale`/`add_offset` once at read.  Uses the module-level host
      !! workspace (registration/bracket-advance-time only — never a
      !! per-step allocation).  Deliberately carries NO `!$acc` directive:
      !! called both before `enter_data` (STATIC field, at registration)
      !! and after it (LINEAR/CYCLIC bracket advance) — the caller pushes
      !! to the device itself, only when that is actually correct
      !! (`data_input_refresh_brackets`).
      type(data_input_field_t), intent(inout) :: fld
      integer, intent(in) :: rec
      logical, intent(in), optional :: into_f1
      integer :: start4(4), count4(4)
      logical :: to_f1

      to_f1 = .false.
      if (present(into_f1)) to_f1 = into_f1

      call data_input_workspace_ensure(fld%nx, fld%ny, fld%nz)

      if (fld%is_3d) then
         start4 = [fld%i0, fld%j0, 1, rec]
         count4 = [fld%nx, fld%ny, fld%nz, 1]
         call nc_get_var_slab_3d(fld%ncid, fld%varid, start4, count4, data_input_ws)
      else
         start4(1:3) = [fld%i0, fld%j0, rec]
         count4(1:3) = [fld%nx, fld%ny, 1]
         call nc_get_var_slab_3d(fld%ncid, fld%varid, start4(1:3), count4(1:3), data_input_ws)
      end if

      data_input_ws = fld%scale*data_input_ws + fld%add_offset

      if (to_f1) then
         fld%f1 = data_input_ws(1:fld%nx, 1:fld%ny, 1:fld%nz)
      else
         fld%f0 = data_input_ws(1:fld%nx, 1:fld%ny, 1:fld%nz)
      end if
      fld%nreads = fld%nreads + 1
   end subroutine data_input_read_slab_impl