ocean_restart_read_local Subroutine

public subroutine ocean_restart_read_local(filename, reg, decomp, meta, t, step, outer_step_count, ierr)

Read a per-rank ocean restart into the registry’s host arrays (FULL local extent) + return the scalar metadata. Validates decomp + grid/vcoord/tracer metadata first and error-stops on mismatch unless ierr is present. A REQUIRED field absent from the file is FATAL; only optional entries warn-and-seed. Must run BEFORE ocean_state_enter_data so the H->D copy carries the restored values up.

Arguments

Type IntentOptional Attributes Name
character(len=*), intent(in) :: filename
type(restart_registry_t), intent(inout) :: reg
type(decomp_t), intent(in) :: decomp
type(ocean_restart_metadata_t), intent(in) :: meta
real(kind=wp), intent(out) :: t
integer, intent(out) :: step
integer, intent(out) :: outer_step_count
integer, intent(out), optional :: ierr

Calls

proc~~ocean_restart_read_local~~CallsGraph proc~ocean_restart_read_local ocean_restart_read_local error error proc~ocean_restart_read_local->error info info proc~ocean_restart_read_local->info nf90_get_var nf90_get_var proc~ocean_restart_read_local->nf90_get_var nf90_inq_varid nf90_inq_varid proc~ocean_restart_read_local->nf90_inq_varid proc~error_ring_push error_ring_push proc~ocean_restart_read_local->proc~error_ring_push proc~nc_check nc_check proc~ocean_restart_read_local->proc~nc_check proc~nc_close nc_close proc~ocean_restart_read_local->proc~nc_close proc~nc_get_varid nc_get_varid proc~ocean_restart_read_local->proc~nc_get_varid proc~nc_open_read nc_open_read proc~ocean_restart_read_local->proc~nc_open_read proc~ocean_restart_check_decomp ocean_restart_check_decomp proc~ocean_restart_read_local->proc~ocean_restart_check_decomp to_string to_string proc~ocean_restart_read_local->to_string warning warning proc~ocean_restart_read_local->warning nf90_strerror nf90_strerror proc~nc_check->nf90_strerror proc~fail fail proc~nc_check->proc~fail proc~nc_close->proc~nc_check nf90_close nf90_close proc~nc_close->nf90_close proc~nc_get_varid->nf90_inq_varid proc~nc_get_varid->proc~nc_check proc~nc_open_read->proc~nc_check nf90_open nf90_open proc~nc_open_read->nf90_open proc~ocean_restart_check_decomp->error proc~ocean_restart_check_decomp->proc~error_ring_push proc~ocean_restart_check_decomp->proc~nc_close proc~ocean_restart_check_decomp->proc~nc_open_read proc~ocean_restart_check_decomp->to_string proc~nc_get_att_int nc_get_att_int proc~ocean_restart_check_decomp->proc~nc_get_att_int proc~fail->error proc~fail->proc~error_ring_push proc~nc_get_att_int->proc~nc_check nf90_get_att nf90_get_att proc~nc_get_att_int->nf90_get_att

Called by

proc~~ocean_restart_read_local~~CalledByGraph proc~ocean_restart_read_local ocean_restart_read_local proc~ocean_state_restart_read ocean_state_restart_read proc~ocean_state_restart_read->proc~ocean_restart_read_local proc~engine_setup engine_setup proc~engine_setup->proc~ocean_state_restart_read 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 proc~driver_run driver_run proc~driver_run->proc~driver_run_ocean proc~rdb_ocean_create_finalize rdb_ocean_create_finalize proc~rdb_ocean_create_finalize->proc~complete_ocean_create proc~rdb_ocean_create_from_string rdb_ocean_create_from_string proc~rdb_ocean_create_from_string->proc~complete_ocean_create

Variables

Type Visibility Attributes Name Initial
integer, private :: check_err
integer, private :: e
character(len=:), private, allocatable :: msg
integer, private :: ncid
integer, private :: status
integer, private :: varid

Source Code

   subroutine ocean_restart_read_local(filename, reg, decomp, meta, t, step, &
                                       outer_step_count, ierr)
      !! Read a per-rank ocean restart into the registry's host arrays
      !! (FULL local extent) + return the scalar metadata.  Validates
      !! decomp + grid/vcoord/tracer metadata first and error-stops on
      !! mismatch unless `ierr` is present.  A REQUIRED field absent from
      !! the file is FATAL; only `optional` entries warn-and-seed.  Must
      !! run BEFORE `ocean_state_enter_data` so the H->D copy carries the
      !! restored values up.
      character(len=*), intent(in) :: filename
      type(restart_registry_t), intent(inout) :: reg
      type(decomp_t), intent(in) :: decomp
      type(ocean_restart_metadata_t), intent(in) :: meta
      real(wp), intent(out) :: t
      integer, intent(out) :: step
      integer, intent(out) :: outer_step_count
      integer, intent(out), optional :: ierr

      integer :: ncid, e, varid, status, check_err
      character(len=:), allocatable :: msg

      t = 0.0_wp
      step = 0
      outer_step_count = 0
      if (present(ierr)) ierr = 0

      call logger%info("Reading ocean restart file: "//trim(filename))

      call ocean_restart_check_decomp(filename, decomp, check_err, meta=meta)
      if (check_err /= 0) then
         if (present(ierr)) then
            ierr = check_err
            return
         end if
         error stop "ocean_restart_read_local: restart metadata mismatch (see log)"
      end if

      call nc_open_read(filename, ncid)
      do e = 1, reg%n
         associate (en => reg%entries(e))
            status = nf90_inq_varid(ncid, trim(en%tag), varid)
            if (status /= nf90_noerr) then
               if (en%optional) then
                  call logger%warning("Restart file lacks optional field "// &
                                      trim(en%tag)//"; leaving it at its seeded value")
                  cycle
               end if
               msg = "Restart file "//trim(filename)// &
                     " is missing REQUIRED field "//trim(en%tag)// &
                     "; refusing to cold-start half the state."
               call error_ring_push(msg)
               call logger%error(msg)
               call nc_close(ncid)
               error stop "ocean_restart_read_local: missing required field"
            end if
            en%found = .true.
            select case (en%rank)
            case (0)
               call nc_check(nf90_get_var(ncid, varid, en%p0), &
                             "reading restart scalar "//trim(en%tag))
            case (2)
               call nc_check(nf90_get_var(ncid, varid, &
                                          en%p2(en%ng + 1:en%ng + en%nx_phys, en%ng + 1:en%ng + en%ny_phys)), &
                             "reading restart "//trim(en%tag))
            case default
               call nc_check(nf90_get_var(ncid, varid, &
                                          en%p3(en%ng + 1:en%ng + en%nx_phys, en%ng + 1:en%ng + en%ny_phys, 1:en%nk)), &
                             "reading restart "//trim(en%tag))
            end select
         end associate
      end do

      call nc_get_varid(ncid, "time", varid)
      call nc_check(nf90_get_var(ncid, varid, t), "reading restart time")
      call nc_get_varid(ncid, "n_steps", varid)
      call nc_check(nf90_get_var(ncid, varid, step), "reading restart n_steps")
      call nc_get_varid(ncid, "outer_step_count", varid)
      call nc_check(nf90_get_var(ncid, varid, outer_step_count), &
                    "reading restart outer_step_count")
      call nc_close(ncid)

      call logger%info("Ocean restart loaded: t = "//to_string(t)//" s, step = "// &
                       to_string(step))
   end subroutine ocean_restart_read_local