rdb_ocean_restart_io Module

Walks a restart_registry_t and writes/reads each registered field as a FULL local array (interior + ghosts) to/from a per-rank NetCDF file, alongside the scalar checkpoint metadata (time, step counters), the decomposition attributes that gate a same-decomp resume, and the grid/vcoord/tracer metadata that gates a same-schema resume.

Durability: the write goes to <filename>.tmp, then a POSIX rename(2) atomically swaps it into place — a crash mid-write leaves the previous checkpoint intact.


Uses

  • module~~rdb_ocean_restart_io~~UsesGraph module~rdb_ocean_restart_io rdb_ocean_restart_io iso_c_binding iso_c_binding module~rdb_ocean_restart_io->iso_c_binding module~rdb_constants rdb_constants module~rdb_ocean_restart_io->module~rdb_constants module~rdb_decomp rdb_decomp module~rdb_ocean_restart_io->module~rdb_decomp module~rdb_error_ring rdb_error_ring module~rdb_ocean_restart_io->module~rdb_error_ring module~rdb_io_netcdf rdb_io_netcdf module~rdb_ocean_restart_io->module~rdb_io_netcdf module~rdb_ocean_restart rdb_ocean_restart module~rdb_ocean_restart_io->module~rdb_ocean_restart module~rdb_ocean_status rdb_ocean_status module~rdb_ocean_restart_io->module~rdb_ocean_status netcdf netcdf module~rdb_ocean_restart_io->netcdf pic_logger pic_logger module~rdb_ocean_restart_io->pic_logger pic_strings pic_strings module~rdb_ocean_restart_io->pic_strings pic_types pic_types module~rdb_constants->pic_types module~rdb_config rdb_config module~rdb_decomp->module~rdb_config module~rdb_error_ring->pic_logger module~rdb_io_netcdf->iso_c_binding module~rdb_io_netcdf->module~rdb_constants module~rdb_io_netcdf->module~rdb_error_ring module~rdb_io_netcdf->netcdf module~rdb_io_netcdf->pic_logger module~rdb_io_netcdf->pic_strings iso_fortran_env iso_fortran_env module~rdb_io_netcdf->iso_fortran_env module~rdb_ocean_restart->module~rdb_constants module~rdb_ocean_restart->pic_logger module~rdb_ocean_restart->pic_strings module~rdb_config->module~rdb_constants module~rdb_config->module~rdb_error_ring module~rdb_config->module~rdb_ocean_status module~rdb_config->pic_logger module~rdb_config->pic_strings module~rdb_ice_enthalpy rdb_ice_enthalpy module~rdb_config->module~rdb_ice_enthalpy module~rdb_ice_init rdb_ice_init module~rdb_config->module~rdb_ice_init module~rdb_nml_schema rdb_nml_schema module~rdb_config->module~rdb_nml_schema pic_ascii pic_ascii module~rdb_config->pic_ascii module~rdb_ice_enthalpy->module~rdb_constants module~rdb_ice_init->module~rdb_constants module~rdb_ice_init->module~rdb_ice_enthalpy module~rdb_grid rdb_grid module~rdb_ice_init->module~rdb_grid module~rdb_ice_column rdb_ice_column module~rdb_ice_init->module~rdb_ice_column module~rdb_ice_state rdb_ice_state module~rdb_ice_init->module~rdb_ice_state module~rdb_multilayer_state rdb_multilayer_state module~rdb_ice_init->module~rdb_multilayer_state module~rdb_ocean_metrics rdb_ocean_metrics module~rdb_ice_init->module~rdb_ocean_metrics module~rdb_nml_schema->module~rdb_constants module~rdb_nml_schema->module~rdb_error_ring module~rdb_nml_schema->pic_logger module~rdb_grid->module~rdb_constants module~rdb_ice_column->module~rdb_constants module~rdb_ice_column->module~rdb_ice_enthalpy module~rdb_ice_mass rdb_ice_mass module~rdb_ice_column->module~rdb_ice_mass module~rdb_ice_optics rdb_ice_optics module~rdb_ice_column->module~rdb_ice_optics module~rdb_ice_state->module~rdb_constants module~rdb_ice_state->iso_fortran_env module~rdb_ice_state->module~rdb_ice_enthalpy module~rdb_ice_state->module~rdb_grid module~rdb_ice_state->module~rdb_ice_column module~rdb_mem_report rdb_mem_report module~rdb_ice_state->module~rdb_mem_report module~rdb_multilayer_state->module~rdb_constants module~rdb_multilayer_state->module~rdb_error_ring module~rdb_multilayer_state->pic_logger module~rdb_multilayer_state->iso_fortran_env module~rdb_multilayer_state->module~rdb_grid module~rdb_efp rdb_efp module~rdb_multilayer_state->module~rdb_efp module~rdb_multilayer_state->module~rdb_mem_report module~rdb_tracer rdb_tracer module~rdb_multilayer_state->module~rdb_tracer module~rdb_ocean_metrics->module~rdb_constants module~rdb_ocean_metrics->module~rdb_error_ring module~rdb_ocean_metrics->module~rdb_io_netcdf module~rdb_ocean_metrics->module~rdb_ocean_status module~rdb_ocean_metrics->netcdf module~rdb_ocean_metrics->pic_logger module~rdb_ocean_metrics->pic_strings module~rdb_ocean_metrics->iso_fortran_env module~rdb_ocean_metrics->module~rdb_grid module~rdb_ocean_metrics->module~rdb_mem_report module~rdb_ocean_bipolar rdb_ocean_bipolar module~rdb_ocean_metrics->module~rdb_ocean_bipolar module~rdb_ocean_fold rdb_ocean_fold module~rdb_ocean_metrics->module~rdb_ocean_fold

Used by

  • module~~rdb_ocean_restart_io~~UsedByGraph module~rdb_ocean_restart_io rdb_ocean_restart_io module~rdb_ocean_state rdb_ocean_state module~rdb_ocean_state->module~rdb_ocean_restart_io module~rdb_driver rdb_driver module~rdb_driver->module~rdb_ocean_state module~rdb_ocean_engine rdb_ocean_engine module~rdb_driver->module~rdb_ocean_engine module~rdb_handle rdb_handle module~rdb_handle->module~rdb_ocean_state module~rdb_handle->module~rdb_ocean_engine module~rdb_ocean_diag_derived rdb_ocean_diag_derived module~rdb_ocean_diag_derived->module~rdb_ocean_state module~rdb_ocean_diag_fills rdb_ocean_diag_fills module~rdb_ocean_diag_derived->module~rdb_ocean_diag_fills module~rdb_ocean_diag_fills->module~rdb_ocean_state module~rdb_ocean_engine->module~rdb_ocean_state module~rdb_ocean_engine->module~rdb_ocean_diag_derived module~rdb_ocean_engine->module~rdb_ocean_diag_fills module~rdb_ocean_setup rdb_ocean_setup module~rdb_ocean_engine->module~rdb_ocean_setup module~rdb_ocean_setup->module~rdb_ocean_state module~rdb_ocean_api rdb_ocean_api module~rdb_ocean_api->module~rdb_handle module~rdb_ocean_api->module~rdb_ocean_diag_derived module~rdb_ocean_api->module~rdb_ocean_diag_fills module~rdb_ocean_api->module~rdb_ocean_engine

Derived Types

type, public ::  ocean_restart_metadata_t

Grid/coordinate/tracer fingerprint validated on read. Distinct from the decomposition metadata (px/py/dims) so a file built with a different vertical resolution, ghost width, vcoord, or tracer set is rejected loudly rather than silently mis-mapped.

Components

Type Visibility Attributes Name Initial
integer, public :: idx_salinity = 0

tracers(:) index of salinity (0 = none).

integer, public :: idx_temperature = 0

tracers(:) index of temperature (0 = none).

integer, public :: n_tracers = 0

Registered tracer count.

integer, public :: nghost = 0

Ghost width.

integer, public :: nz_ml = 0

Multilayer layer count.

character(len=32), public :: vcoord_name = ""

Human-readable vcoord tag (for the mismatch message).

integer, public :: vcoord_type = 0

Vertical-coordinate enum (VCOORD_*).


Functions

private function posix_rename(oldpath, newpath) result(rc)

Atomically rename oldpath -> newpath via libc rename(2). Returns 0 on success, -1 on error.

Arguments

Type IntentOptional Attributes Name
character(len=*), intent(in) :: oldpath
character(len=*), intent(in) :: newpath

Return Value integer

private function restart_io_ok(local_ierr, ierr, ncid) result(ok)

Translate a raw nc_check-style status (0 = ok) from one of the nc_* calls in ocean_restart_write_local into the caller’s ierr contract. Mirrors rdb_bathymetry’s bathy_io_ok / rdb_ocean_diag_netcdf’s diag_io_ok (P0.1 F1 / P7 F1): closes ncid (when given) on failure so a mid-write error does not leak the file handle, sets ierr = OCEAN_STATUS_ERR_IO when present, or error stops with the generic nc_check text when ierr is absent (byte-identical legacy behaviour).

Arguments

Type IntentOptional Attributes Name
integer, intent(in) :: local_ierr
integer, intent(out), optional :: ierr
integer, intent(in), optional :: ncid

Return Value logical

private pure function string_to_c(s) result(c)

Pack a Fortran string into a null-terminated c_char array.

Arguments

Type IntentOptional Attributes Name
character(len=*), intent(in) :: s

Return Value character(kind=c_char, len=1), allocatable, (:)


Subroutines

public subroutine ocean_restart_check_decomp(filename, decomp, ierr, meta)

Validate schema + decomposition (+ optional grid/vcoord/tracer) metadata in filename against the live decomp/meta. ierr = 0 on match; 1 = schema, 2 = decomposition, 3 = grid/vcoord/tracer mismatch.

Arguments

Type IntentOptional Attributes Name
character(len=*), intent(in) :: filename
type(decomp_t), intent(in) :: decomp
integer, intent(out) :: ierr
type(ocean_restart_metadata_t), intent(in), optional :: meta

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

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

Write a per-rank ocean restart file from the registry durably (to <filename>.tmp then POSIX-rename). Device sync (!$acc update self) on the device-mapped arrays must already have been done by the caller — this is pure host NetCDF I/O.

Read more…

Arguments

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

Non-zero (OCEAN_STATUS_ERR_IO) on any NetCDF or rename failure when present; absent behaves as today (error stop).

private subroutine nc_get_varid(ncid, name, varid)

Arguments

Type IntentOptional Attributes Name
integer, intent(in) :: ncid
character(len=*), intent(in) :: name
integer, intent(out) :: varid