rdb_ocean_data_forcing Module

Binds time-varying NetCDF surface fields onto the ocean C-grid forcing slots: wind stress (ocean_surface_stress_t%tau_x/tau_y) and the surface heat / freshwater / salt fluxes (ocean_surface_flux_t). Owns the (file, variable) -> slot mapping that rdb_ocean_data_input deliberately does not; owns no file handles, no time axis and no buffers of its own — those all live in the reader.

Two-call contract. ocean_data_forcing_configure runs once in the driver’s configure phase, BEFORE ocean_state_enter_data (registration opens each file and allocates the reader’s f0/f1 bracket buffers, which enter_data then maps). ocean_data_forcing_apply runs once per outer step, immediately after the driver’s ocean_data_input_update_all(t_current) — the reader’s fail-loud freshness check enforces that ordering rather than letting a stale bracket blend silently.

This slot maps nothing. It holds registration ids and logicals that are read HOST-side only, so it adds no term to ocean_state_enter_data — stated explicitly because the standing rule is that a new ocean slot does wire in, and a silent omission there is a 150-1500x memcpy bug. The arrays it writes into are mapped by their own owning slots.

Ghost cells are EXCHANGED, never extrapolated. The reader fills physical cells only and the consumer owns the halo. For the stress pair that halo is filled by ocean_seam_refresh_surface_stress — MPI exchange, then periodic wrap on any axis the exchange did not own, then the tripolar fold — which also re-derives stress_mag (read by KPP/EPBL for u_*, and otherwise stale from the configure-time wind).

An earlier revision zero-gradient-extended the blend into its ghosts. That is wrong under decomposition and worth recording so it is not reintroduced: at an MPI seam the ghost belongs to the neighbour rank, so copying this rank’s edge value there produces a decomposition-dependent answer that no single-rank test can see. Extrapolating forcing into a halo is a pattern MOM6 does not use anywhere; it exchanges the stress pair and relies on masking at true domain edges.

The thermodynamic flux tags (heat, salt, evap, lprec) get NO ghost treatment at all, deliberately: they are applied strictly column-locally, so no kernel ever reads them in a ghost cell. A future kernel that takes a horizontal gradient of one of them owns adding the exchange.

The namelist is the expert-level surface, not the intended one. &ocean_dataovr_nml is a flat, fixed set of tags because that is what the strict schema can express; it is not the ergonomic way to describe a forcing dataset. The binding itself is programmatic — register_tag is a thin wrapper over ocean_data_input_register_2d returning an opaque id — so a future Python/C driver should call the registration path DIRECTLY with its own field table rather than synthesising namelist text. Keep ocean_data_forcing_configure a pure translation of config to registrations, with no logic that a non-namelist caller would have to re-implement.

Heat/salt destination depends on use_components — see resolve_flux_targets. ocean_surface_flux_assemble fully overwrites Q_heat/Q_salt from the component set every thermo step, so under components the file must feed a component instead.


Uses

  • module~~rdb_ocean_data_forcing~~UsesGraph module~rdb_ocean_data_forcing rdb_ocean_data_forcing module~rdb_config rdb_config module~rdb_ocean_data_forcing->module~rdb_config module~rdb_constants rdb_constants module~rdb_ocean_data_forcing->module~rdb_constants module~rdb_error_ring rdb_error_ring module~rdb_ocean_data_forcing->module~rdb_error_ring module~rdb_grid rdb_grid module~rdb_ocean_data_forcing->module~rdb_grid module~rdb_ocean_boundary_types rdb_ocean_boundary_types module~rdb_ocean_data_forcing->module~rdb_ocean_boundary_types module~rdb_ocean_data_input rdb_ocean_data_input module~rdb_ocean_data_forcing->module~rdb_ocean_data_input module~rdb_ocean_halo_state rdb_ocean_halo_state module~rdb_ocean_data_forcing->module~rdb_ocean_halo_state module~rdb_ocean_status rdb_ocean_status module~rdb_ocean_data_forcing->module~rdb_ocean_status module~rdb_ocean_surface_flux rdb_ocean_surface_flux module~rdb_ocean_data_forcing->module~rdb_ocean_surface_flux module~rdb_ocean_surface_stress rdb_ocean_surface_stress module~rdb_ocean_data_forcing->module~rdb_ocean_surface_stress pic_logger pic_logger module~rdb_ocean_data_forcing->pic_logger pic_strings pic_strings module~rdb_ocean_data_forcing->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 pic_types pic_types module~rdb_constants->pic_types module~rdb_error_ring->pic_logger module~rdb_grid->module~rdb_constants module~rdb_ocean_boundary_types->module~rdb_constants module~rdb_ocean_boundary_types->module~rdb_grid module~rdb_ocean_boundary_types->module~rdb_ocean_status module~rdb_ocean_boundary_types->pic_logger iso_fortran_env iso_fortran_env module~rdb_ocean_boundary_types->iso_fortran_env module~rdb_mem_report rdb_mem_report module~rdb_ocean_boundary_types->module~rdb_mem_report module~rdb_ocean_tide_astro rdb_ocean_tide_astro module~rdb_ocean_boundary_types->module~rdb_ocean_tide_astro module~rdb_ocean_boundary_types->pic_ascii module~rdb_ocean_data_input->module~rdb_config module~rdb_ocean_data_input->module~rdb_constants module~rdb_ocean_data_input->module~rdb_error_ring module~rdb_ocean_data_input->module~rdb_grid module~rdb_ocean_data_input->module~rdb_ocean_status module~rdb_ocean_data_input->pic_logger module~rdb_ocean_data_input->pic_strings module~rdb_ocean_data_input->iso_fortran_env module~rdb_io_netcdf rdb_io_netcdf module~rdb_ocean_data_input->module~rdb_io_netcdf module~rdb_ocean_data_input->module~rdb_mem_report netcdf netcdf module~rdb_ocean_data_input->netcdf module~rdb_ocean_data_input->pic_ascii module~rdb_ocean_halo_state->module~rdb_constants module~rdb_ocean_halo_state->module~rdb_grid module~rdb_ocean_halo_state->module~rdb_ocean_boundary_types module~rdb_ocean_halo_state->module~rdb_ocean_surface_stress module~rdb_ice_state rdb_ice_state module~rdb_ocean_halo_state->module~rdb_ice_state module~rdb_multilayer_state rdb_multilayer_state module~rdb_ocean_halo_state->module~rdb_multilayer_state module~rdb_ocean_fold_apply rdb_ocean_fold_apply module~rdb_ocean_halo_state->module~rdb_ocean_fold_apply module~rdb_ocean_halo rdb_ocean_halo module~rdb_ocean_halo_state->module~rdb_ocean_halo module~rdb_ocean_halo_counters rdb_ocean_halo_counters module~rdb_ocean_halo_state->module~rdb_ocean_halo_counters module~rdb_ocean_periodic rdb_ocean_periodic module~rdb_ocean_halo_state->module~rdb_ocean_periodic module~rdb_profiler rdb_profiler module~rdb_ocean_halo_state->module~rdb_profiler module~rdb_ocean_surface_flux->module~rdb_constants module~rdb_ocean_surface_flux->module~rdb_grid module~rdb_ocean_surface_flux->iso_fortran_env module~rdb_ocean_surface_flux->module~rdb_mem_report module~rdb_ocean_surface_flux->module~rdb_multilayer_state module~rdb_ocean_surface_stress->module~rdb_constants module~rdb_ocean_surface_stress->module~rdb_grid module~rdb_ocean_surface_stress->iso_fortran_env module~rdb_ocean_surface_stress->module~rdb_mem_report module~rdb_ocean_surface_stress->module~rdb_multilayer_state module~rdb_scratch_3d rdb_scratch_3d module~rdb_ocean_surface_stress->module~rdb_scratch_3d module~rdb_ice_enthalpy->module~rdb_constants module~rdb_ice_init->module~rdb_constants module~rdb_ice_init->module~rdb_grid module~rdb_ice_init->module~rdb_ice_enthalpy module~rdb_ice_init->module~rdb_ice_state module~rdb_ice_init->module~rdb_multilayer_state module~rdb_ice_column rdb_ice_column module~rdb_ice_init->module~rdb_ice_column module~rdb_ocean_metrics rdb_ocean_metrics module~rdb_ice_init->module~rdb_ocean_metrics module~rdb_ice_state->module~rdb_constants module~rdb_ice_state->module~rdb_grid module~rdb_ice_state->iso_fortran_env module~rdb_ice_state->module~rdb_ice_enthalpy module~rdb_ice_state->module~rdb_mem_report module~rdb_ice_state->module~rdb_ice_column module~rdb_io_netcdf->module~rdb_constants module~rdb_io_netcdf->module~rdb_error_ring module~rdb_io_netcdf->pic_logger module~rdb_io_netcdf->pic_strings module~rdb_io_netcdf->iso_fortran_env module~rdb_io_netcdf->netcdf iso_c_binding iso_c_binding module~rdb_io_netcdf->iso_c_binding module~rdb_mem_report->module~rdb_constants module~rdb_mem_report->pic_logger module~rdb_mem_report->pic_strings module~rdb_mem_report->iso_fortran_env module~rdb_multilayer_state->module~rdb_constants module~rdb_multilayer_state->module~rdb_error_ring module~rdb_multilayer_state->module~rdb_grid module~rdb_multilayer_state->pic_logger module~rdb_multilayer_state->iso_fortran_env module~rdb_multilayer_state->module~rdb_mem_report module~rdb_efp rdb_efp module~rdb_multilayer_state->module~rdb_efp module~rdb_tracer rdb_tracer module~rdb_multilayer_state->module~rdb_tracer module~rdb_nml_schema->module~rdb_constants module~rdb_nml_schema->module~rdb_error_ring module~rdb_nml_schema->pic_logger module~rdb_ocean_fold_apply->module~rdb_constants module~rdb_ocean_fold_apply->module~rdb_grid module~rdb_ocean_fold_apply->module~rdb_ocean_boundary_types module~rdb_ocean_fold_apply->module~rdb_multilayer_state module~rdb_ocean_fold rdb_ocean_fold module~rdb_ocean_fold_apply->module~rdb_ocean_fold module~rdb_ocean_fold_exchange rdb_ocean_fold_exchange module~rdb_ocean_fold_apply->module~rdb_ocean_fold_exchange module~rdb_ocean_halo->module~rdb_constants module~rdb_ocean_halo->module~rdb_error_ring module~rdb_ocean_halo->module~rdb_ocean_status module~rdb_ocean_halo->pic_logger module~rdb_ocean_halo->pic_strings module~rdb_ocean_halo->module~rdb_ocean_halo_counters module~rdb_ocean_halo->module~rdb_ocean_periodic module~rdb_comm_env rdb_comm_env module~rdb_ocean_halo->module~rdb_comm_env module~rdb_decomp rdb_decomp module~rdb_ocean_halo->module~rdb_decomp pic_mpi_lib pic_mpi_lib module~rdb_ocean_halo->pic_mpi_lib module~rdb_ocean_halo_counters->pic_strings module~rdb_ocean_halo_counters->iso_fortran_env module~rdb_ocean_periodic->module~rdb_constants module~rdb_ocean_periodic->module~rdb_grid module~rdb_ocean_periodic->module~rdb_ocean_boundary_types module~rdb_ocean_periodic->module~rdb_multilayer_state module~rdb_ocean_tide_astro->module~rdb_constants module~rdb_ocean_tide_astro->iso_fortran_env module~rdb_profiler->pic_logger module~rdb_profiler->iso_fortran_env module~rdb_scratch_3d->module~rdb_constants module~rdb_scratch_3d->iso_fortran_env module~rdb_scratch_3d->module~rdb_mem_report module~rdb_comm_env->module~rdb_constants module~rdb_comm_env->iso_fortran_env module~rdb_comm_env->pic_mpi_lib module~rdb_decomp->module~rdb_config module~rdb_efp->iso_fortran_env ieee_arithmetic ieee_arithmetic module~rdb_efp->ieee_arithmetic 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_ocean_fold->module~rdb_constants module~rdb_ocean_fold_exchange->module~rdb_constants module~rdb_ocean_fold_exchange->module~rdb_error_ring module~rdb_ocean_fold_exchange->module~rdb_ocean_status module~rdb_ocean_fold_exchange->pic_logger module~rdb_ocean_fold_exchange->pic_strings module~rdb_ocean_fold_exchange->module~rdb_comm_env module~rdb_ocean_fold_exchange->module~rdb_decomp module~rdb_ocean_fold_exchange->module~rdb_ocean_fold module~rdb_ocean_fold_exchange->pic_mpi_lib module~rdb_ocean_fold_plan rdb_ocean_fold_plan module~rdb_ocean_fold_exchange->module~rdb_ocean_fold_plan module~rdb_ocean_metrics->module~rdb_constants module~rdb_ocean_metrics->module~rdb_error_ring module~rdb_ocean_metrics->module~rdb_grid module~rdb_ocean_metrics->module~rdb_ocean_status 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_io_netcdf module~rdb_ocean_metrics->module~rdb_mem_report module~rdb_ocean_metrics->netcdf module~rdb_ocean_metrics->module~rdb_ocean_fold module~rdb_ocean_bipolar rdb_ocean_bipolar module~rdb_ocean_metrics->module~rdb_ocean_bipolar module~rdb_tracer->module~rdb_constants module~rdb_tracer->module~rdb_grid module~rdb_tracer->iso_fortran_env module~rdb_tracer->module~rdb_mem_report module~rdb_ice_mass->module~rdb_constants module~rdb_ice_mass->module~rdb_ice_enthalpy module~rdb_ice_optics->module~rdb_constants module~rdb_ice_optics->module~rdb_ice_enthalpy module~rdb_ocean_bipolar->module~rdb_constants

Used by

  • module~~rdb_ocean_data_forcing~~UsedByGraph module~rdb_ocean_data_forcing rdb_ocean_data_forcing module~rdb_ocean_engine rdb_ocean_engine module~rdb_ocean_engine->module~rdb_ocean_data_forcing module~rdb_ocean_state rdb_ocean_state module~rdb_ocean_engine->module~rdb_ocean_state module~rdb_ocean_diag_derived rdb_ocean_diag_derived module~rdb_ocean_engine->module~rdb_ocean_diag_derived module~rdb_ocean_diag_fills rdb_ocean_diag_fills 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_state->module~rdb_ocean_data_forcing module~rdb_driver rdb_driver module~rdb_driver->module~rdb_ocean_engine module~rdb_driver->module~rdb_ocean_state module~rdb_handle rdb_handle module~rdb_handle->module~rdb_ocean_engine module~rdb_handle->module~rdb_ocean_state module~rdb_ocean_api rdb_ocean_api module~rdb_ocean_api->module~rdb_ocean_engine 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_diag_derived->module~rdb_ocean_state module~rdb_ocean_diag_derived->module~rdb_ocean_diag_fills module~rdb_ocean_diag_fills->module~rdb_ocean_state module~rdb_ocean_setup->module~rdb_ocean_state

Derived Types

type, public ::  ocean_data_forcing_t

Registration bookkeeping for the file-driven surface tags. A zero id_* means that tag is not file-driven (blank file in &ocean_dataovr_nml) and its slot keeps whatever the configure-time scalar/formula path seeded.

Components

Type Visibility Attributes Name Initial
logical, public :: active = .false.

.true. once at least one tag registered. .false. makes ocean_data_forcing_apply an immediate return.

logical, public :: heat_to_component = .false.

.true. => the heat tag blends into heat_added (components on); .false. => straight into Q_heat. Resolved once at configure so the per-step path carries no mode test.

integer, public :: id_evap = 0
integer, public :: id_heat = 0
integer, public :: id_lprec = 0
integer, public :: id_salt = 0
integer, public :: id_tau_x = 0
integer, public :: id_tau_y = 0
logical, public :: salt_to_component = .false.

Same for the salt tag: salt_flux vs Q_salt.


Subroutines

public subroutine ocean_data_forcing_apply(this, reader, grid, ss, sf, bc, t)

Blend every active tag’s current bracket into its slot. t must be the same model time ocean_data_input_update_all was just called with — the reader enforces this and aborts otherwise.

Read more…

Arguments

Type IntentOptional Attributes Name
type(ocean_data_forcing_t), intent(in) :: this
type(ocean_data_input_t), intent(in) :: reader
type(hgrid_t), intent(in) :: grid
type(ocean_surface_stress_t), intent(inout) :: ss
type(ocean_surface_flux_t), intent(inout) :: sf
type(ocean_bc_state_t), intent(in) :: bc

Supplies the periodic / north-fold topology to the seam refresh.

real(kind=wp), intent(in) :: t

public subroutine ocean_data_forcing_configure(cfg, reader, grid, ss, sf, bc, this, ierr)

Register every configured tag against the shared reader and resolve the heat/salt destinations. A no-op when enable = .false. — nothing registers, so ocean_data_input_update_all stays a no-op and the run is bit-identical.

Arguments

Type IntentOptional Attributes Name
type(ocean_dataovr_config_t), intent(in) :: cfg
type(ocean_data_input_t), intent(inout) :: reader
type(hgrid_t), intent(in) :: grid
type(ocean_surface_stress_t), intent(inout) :: ss
type(ocean_surface_flux_t), intent(inout) :: sf
type(ocean_bc_state_t), intent(in) :: bc

Periodic / north-fold topology for the configure-time seam refresh.

type(ocean_data_forcing_t), intent(out) :: this
integer, intent(out), optional :: ierr

Non-zero (OCEAN_STATUS_ERR_SETUP/OCEAN_STATUS_ERR_IO, see rdb_ocean_status) on a malformed &ocean_dataovr_nml group or a registration failure (bad file/variable/dims) when present; absent behaves as today (error stop).

private subroutine check_time_mode(cfg, ierr)

Fail loud on a cyclic group with no period. The reader makes the same check per field; catching it once here names the namelist group the user actually edited.

Arguments

Type IntentOptional Attributes Name
type(ocean_dataovr_config_t), intent(in) :: cfg
integer, intent(out), optional :: ierr

private subroutine register_tag(cfg, e, tag, reader, grid, oor, dn1, dn2, di0, dj0, id, nx_extra, ny_extra, ierr)

Register one tag if it names a file, else leave id = 0. Shared time-axis settings come from the group; scale/add are per tag.

Arguments

Type IntentOptional Attributes Name
type(ocean_dataovr_config_t), intent(in) :: cfg
type(dataovr_entry_config_t), intent(in) :: e
character(len=*), intent(in) :: tag
type(ocean_data_input_t), intent(inout) :: reader
type(hgrid_t), intent(in) :: grid
integer, intent(in) :: oor
integer, intent(in) :: dn1
integer, intent(in) :: dn2
integer, intent(in) :: di0
integer, intent(in) :: dj0
integer, intent(out) :: id
integer, intent(in), optional :: nx_extra

Face-field slab widening; forwarded to the reader.

integer, intent(in), optional :: ny_extra

Face-field slab widening; forwarded to the reader.

integer, intent(out), optional :: ierr

private subroutine resolve_flux_targets(cfg, sf, this, ierr)

Pick the heat/salt destination for this run and reject the freshwater tags when the component set they need is absent.

Read more…

Arguments

Type IntentOptional Attributes Name
type(ocean_dataovr_config_t), intent(in) :: cfg
type(ocean_surface_flux_t), intent(in) :: sf
type(ocean_data_forcing_t), intent(inout) :: this
integer, intent(out), optional :: ierr