rdb_scratch_3d Module

Single owner for (n1, n2, n3) scratch arrays. Every column- local kernel slot (continuity, coriolis_adv, pressure_force, lateral-mix vorticity scratch, KPP solve scratch) declares its per-step workspace as a scratch_3d_buffer_t rather than as a bare real(wp), allocatable :: foo(:, :, :).

Why centralise this: 1. One allocation policy. The strided hybrid loop pattern (see src/core/ocean/README.md) sizes every column-local scratch at (stride, stride, nz_ml) with stride = ocean_state%column_stride. Putting that policy in one type means a new slot follows the convention by construction, not by remembering to copy-paste it. 2. One GPU-mapping site. enter_data / exit_data live on the type, so every slot that uses this type inherits the mapping for free — no per-slot directive copies to keep in sync. 3. One resize site. If a kernel discovers it needs a different shape mid-run (rare — only happens if stride becomes dynamic), ensure_size reallocates and remaps in one place. 4. Cheap finite-check. Phase 6 debug guards walk every scratch_3d_buffer_t instance after each slot kernel and verify no NaN / out-of-range leaked into scratch.

Phase 2 status: alloc + GPU enter_data / exit_data live. Phase 1+ items (ensure_size, assert_finite) still pending.


Uses

  • module~~rdb_scratch_3d~~UsesGraph module~rdb_scratch_3d rdb_scratch_3d iso_fortran_env iso_fortran_env module~rdb_scratch_3d->iso_fortran_env module~rdb_constants rdb_constants module~rdb_scratch_3d->module~rdb_constants module~rdb_mem_report rdb_mem_report module~rdb_scratch_3d->module~rdb_mem_report pic_types pic_types module~rdb_constants->pic_types module~rdb_mem_report->iso_fortran_env module~rdb_mem_report->module~rdb_constants pic_logger pic_logger module~rdb_mem_report->pic_logger pic_strings pic_strings module~rdb_mem_report->pic_strings

Used by

  • module~~rdb_scratch_3d~~UsedByGraph module~rdb_scratch_3d rdb_scratch_3d module~rdb_continuity rdb_continuity module~rdb_continuity->module~rdb_scratch_3d module~rdb_ocean_mle rdb_ocean_mle module~rdb_continuity->module~rdb_ocean_mle module~rdb_coriolis_adv rdb_coriolis_adv module~rdb_coriolis_adv->module~rdb_scratch_3d module~rdb_ocean_bottom_drag rdb_ocean_bottom_drag module~rdb_ocean_bottom_drag->module~rdb_scratch_3d module~rdb_ocean_epbl rdb_ocean_epbl module~rdb_ocean_epbl->module~rdb_scratch_3d module~rdb_ocean_surface_stress rdb_ocean_surface_stress module~rdb_ocean_epbl->module~rdb_ocean_surface_stress module~rdb_ocean_hdiff_tracer rdb_ocean_hdiff_tracer module~rdb_ocean_hdiff_tracer->module~rdb_scratch_3d module~rdb_ocean_horizontal_viscosity rdb_ocean_horizontal_viscosity module~rdb_ocean_horizontal_viscosity->module~rdb_scratch_3d module~rdb_ocean_lateral_mix rdb_ocean_lateral_mix module~rdb_ocean_horizontal_viscosity->module~rdb_ocean_lateral_mix module~rdb_ocean_lateral_mix->module~rdb_scratch_3d module~rdb_ocean_pressure_force rdb_ocean_pressure_force module~rdb_ocean_pressure_force->module~rdb_scratch_3d module~rdb_ocean_surface_stress->module~rdb_scratch_3d module~rdb_ocean_top_drag rdb_ocean_top_drag module~rdb_ocean_top_drag->module~rdb_scratch_3d module~rdb_ocean_vdiff rdb_ocean_vdiff module~rdb_ocean_vdiff->module~rdb_scratch_3d module~rdb_ocean_vertical_advection rdb_ocean_vertical_advection module~rdb_ocean_vertical_advection->module~rdb_scratch_3d module~rdb_barotropic_coupling rdb_barotropic_coupling module~rdb_barotropic_coupling->module~rdb_coriolis_adv module~rdb_barotropic_coupling->module~rdb_ocean_bottom_drag module~rdb_barotropic_coupling->module~rdb_ocean_horizontal_viscosity module~rdb_barotropic_coupling->module~rdb_ocean_pressure_force module~rdb_barotropic_coupling->module~rdb_ocean_surface_stress module~rdb_barotropic_coupling->module~rdb_ocean_top_drag module~rdb_ice_ocean_coupler rdb_ice_ocean_coupler module~rdb_ice_ocean_coupler->module~rdb_ocean_surface_stress module~rdb_ocean_halo_state rdb_ocean_halo_state module~rdb_ice_ocean_coupler->module~rdb_ocean_halo_state module~rdb_ice_transport rdb_ice_transport module~rdb_ice_transport->module~rdb_continuity module~rdb_ice_transport->module~rdb_ocean_halo_state module~rdb_ocean_bt_budget_probe rdb_ocean_bt_budget_probe module~rdb_ocean_bt_budget_probe->module~rdb_coriolis_adv module~rdb_ocean_bt_budget_probe->module~rdb_ocean_bottom_drag module~rdb_ocean_bt_budget_probe->module~rdb_ocean_horizontal_viscosity module~rdb_ocean_bt_budget_probe->module~rdb_ocean_pressure_force module~rdb_ocean_bt_budget_probe->module~rdb_ocean_surface_stress module~rdb_ocean_data_forcing rdb_ocean_data_forcing module~rdb_ocean_data_forcing->module~rdb_ocean_surface_stress module~rdb_ocean_data_forcing->module~rdb_ocean_halo_state module~rdb_ocean_dyn rdb_ocean_dyn module~rdb_ocean_dyn->module~rdb_continuity module~rdb_ocean_dyn->module~rdb_coriolis_adv module~rdb_ocean_dyn->module~rdb_ocean_bottom_drag module~rdb_ocean_dyn->module~rdb_ocean_epbl module~rdb_ocean_dyn->module~rdb_ocean_hdiff_tracer module~rdb_ocean_dyn->module~rdb_ocean_horizontal_viscosity module~rdb_ocean_dyn->module~rdb_ocean_lateral_mix module~rdb_ocean_dyn->module~rdb_ocean_pressure_force module~rdb_ocean_dyn->module~rdb_ocean_surface_stress module~rdb_ocean_dyn->module~rdb_ocean_top_drag module~rdb_ocean_dyn->module~rdb_ocean_vdiff module~rdb_ocean_dyn->module~rdb_ocean_vertical_advection module~rdb_ocean_dyn->module~rdb_barotropic_coupling module~rdb_ocean_dyn->module~rdb_ocean_bt_budget_probe module~rdb_ocean_ghost_poison rdb_ocean_ghost_poison module~rdb_ocean_dyn->module~rdb_ocean_ghost_poison module~rdb_ocean_dyn->module~rdb_ocean_halo_state module~rdb_ocean_ke_probe rdb_ocean_ke_probe module~rdb_ocean_dyn->module~rdb_ocean_ke_probe module~rdb_ocean_dyn->module~rdb_ocean_mle module~rdb_ocean_vmix rdb_ocean_vmix module~rdb_ocean_dyn->module~rdb_ocean_vmix module~rdb_ocean_engine rdb_ocean_engine module~rdb_ocean_engine->module~rdb_ocean_surface_stress module~rdb_ocean_engine->module~rdb_ice_ocean_coupler module~rdb_ocean_engine->module~rdb_ice_transport module~rdb_ocean_engine->module~rdb_ocean_data_forcing module~rdb_ocean_engine->module~rdb_ocean_dyn module~rdb_ocean_engine->module~rdb_ocean_halo_state module~rdb_ocean_setup rdb_ocean_setup module~rdb_ocean_engine->module~rdb_ocean_setup 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_ghost_poison->module~rdb_ocean_surface_stress module~rdb_ocean_halo_state->module~rdb_ocean_surface_stress module~rdb_ocean_halo_width rdb_ocean_halo_width module~rdb_ocean_halo_width->module~rdb_coriolis_adv module~rdb_ocean_ke_probe->module~rdb_coriolis_adv module~rdb_ocean_mle->module~rdb_ocean_epbl module~rdb_ocean_mle->module~rdb_ocean_surface_stress module~rdb_ocean_setup->module~rdb_coriolis_adv module~rdb_ocean_setup->module~rdb_ocean_bottom_drag module~rdb_ocean_setup->module~rdb_ocean_epbl module~rdb_ocean_setup->module~rdb_ocean_horizontal_viscosity module~rdb_ocean_setup->module~rdb_ocean_lateral_mix module~rdb_ocean_setup->module~rdb_ocean_pressure_force module~rdb_ocean_setup->module~rdb_ocean_surface_stress module~rdb_ocean_setup->module~rdb_ocean_top_drag module~rdb_ocean_setup->module~rdb_ocean_vdiff module~rdb_ocean_setup->module~rdb_ocean_dyn module~rdb_ocean_setup->module~rdb_ocean_halo_state module~rdb_ocean_setup->module~rdb_ocean_state module~rdb_ocean_setup->module~rdb_ocean_vmix module~rdb_ocean_state->module~rdb_continuity module~rdb_ocean_state->module~rdb_coriolis_adv module~rdb_ocean_state->module~rdb_ocean_bottom_drag module~rdb_ocean_state->module~rdb_ocean_epbl module~rdb_ocean_state->module~rdb_ocean_hdiff_tracer module~rdb_ocean_state->module~rdb_ocean_horizontal_viscosity module~rdb_ocean_state->module~rdb_ocean_lateral_mix module~rdb_ocean_state->module~rdb_ocean_pressure_force module~rdb_ocean_state->module~rdb_ocean_surface_stress module~rdb_ocean_state->module~rdb_ocean_top_drag module~rdb_ocean_state->module~rdb_ocean_vdiff module~rdb_ocean_state->module~rdb_ocean_vertical_advection module~rdb_ocean_state->module~rdb_ocean_data_forcing module~rdb_ocean_state->module~rdb_ocean_dyn module~rdb_ocean_state->module~rdb_ocean_mle module~rdb_ocean_state->module~rdb_ocean_vmix module~rdb_ocean_vmix->module~rdb_ocean_surface_stress proc~validate_config validate_config proc~validate_config->module~rdb_coriolis_adv proc~validate_config->module~rdb_ocean_bottom_drag proc~validate_config->module~rdb_ocean_horizontal_viscosity proc~validate_config->module~rdb_ocean_lateral_mix proc~validate_config->module~rdb_ocean_pressure_force proc~validate_config->module~rdb_ocean_top_drag proc~validate_config->module~rdb_ocean_vmix module~rdb_driver rdb_driver module~rdb_driver->module~rdb_ocean_dyn 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_dyn module~rdb_ocean_api->module~rdb_ocean_engine module~rdb_ocean_api->module~rdb_ocean_halo_width 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

Derived Types

type, public ::  scratch_3d_buffer_t

Components

Type Visibility Attributes Name Initial
real(kind=wp), public, allocatable :: data(:,:,:)

The scratch storage. Access in a kernel as slot%scratch%data(i, j, k). Note: this is a single derived type (not array-of-derived-types), so the !$acc indirection bug from the array-of-DT pattern does not apply.

logical, public :: is_init = .false.

True between init and destroy. Prefer this to allocated(this%data) — tracks GPU device attachment too.

integer, public :: n1 = 0

First-dim size, typically stride (or stride+1 on face-located buffers).

integer, public :: n2 = 0

Second-dim size, typically stride.

integer, public :: n3 = 0

Third-dim size, typically nz_ml (or nz_ml+1 for layer-interface buffers).

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

Human-readable tag for diagnostics + debug guard messages (“kpp_bulk_ri_scratch”, “ppm_h_face_left_x”, …).

Type-Bound Procedures

procedure, public, non_overridable :: bytes => scratch_3d_buffer_bytes
procedure, public, non_overridable :: destroy => scratch_3d_buffer_destroy
procedure, public, non_overridable :: enter_data => scratch_3d_buffer_enter_data
procedure, public, non_overridable :: exit_data => scratch_3d_buffer_exit_data
procedure, public, non_overridable :: init => scratch_3d_buffer_init

Functions

private pure function scratch_3d_buffer_bytes(this) result(nbytes)

Counted allocatable footprint of the 3D scratch buffer slot (0 when unallocated).

Arguments

Type IntentOptional Attributes Name
class(scratch_3d_buffer_t), intent(in) :: this

Return Value integer(kind=int64)


Subroutines

public subroutine scratch_3d_buffer_enter_data_impl(this)

Attach the scratch payload to the device holding the HOST payload: zero from init (allocate(..., source = 0.0_wp)), or whatever a warm-restart read restored into it before the map. The zero half is a contract, not an implementation detail: a consumer whose producer was SKIPPED this step is entitled to read zero on a cold start, and it must read zero on BOTH toolchains (see the inline note below for the pred_corr predictor that does exactly that). type(...) (not class) dummy on purpose: a by-reference non-polymorphic dummy aliases the heap object, so copyin(this%data) attaches against a heap base — no polymorphic stack box for AMD to reject.

Read more…

Arguments

Type IntentOptional Attributes Name
type(scratch_3d_buffer_t), intent(inout) :: this

public subroutine scratch_3d_buffer_exit_data_impl(this)

Release the scratch payload from the device. No copyout — scratch contents are per-step intermediates with no host-side meaning. No-op when never allocated (mirrors scratch_3d_buffer_enter_data_impl’s gate).

Arguments

Type IntentOptional Attributes Name
type(scratch_3d_buffer_t), intent(inout) :: this

private subroutine scratch_3d_buffer_destroy(this)

Arguments

Type IntentOptional Attributes Name
class(scratch_3d_buffer_t), intent(inout) :: this

private subroutine scratch_3d_buffer_enter_data(this)

Type-bound wrapper — keeps buf%enter_data() call sites working. Delegates to the non-polymorphic impl so the OpenMP map base is the heap object (see the impl + the public-decl comment above).

Arguments

Type IntentOptional Attributes Name
class(scratch_3d_buffer_t), intent(inout) :: this

private subroutine scratch_3d_buffer_exit_data(this)

Type-bound wrapper — see scratch_3d_buffer_enter_data.

Arguments

Type IntentOptional Attributes Name
class(scratch_3d_buffer_t), intent(inout) :: this

private subroutine scratch_3d_buffer_init(this, n1, n2, n3, name)

Allocate the host-side storage at (n1, n2, n3), zero-filled. GPU attachment is a separate step via enter_data — init runs before the device exists in the typical init-then-enter-data sequence.

Arguments

Type IntentOptional Attributes Name
class(scratch_3d_buffer_t), intent(inout) :: this
integer, intent(in) :: n1
integer, intent(in) :: n2
integer, intent(in) :: n3
character(len=*), intent(in), optional :: name