rdb_ocean_hdiff_tracer Module

Kernel state for the per-tracer horizontal-diffusion sweep. Sits alongside rdb_ocean_horizontal_viscosity (which does the momentum half of horizontal mixing); this module is the tracer-side counterpart. Same compute-then-apply pattern, same scratch-buffer two-pass design for race-free do concurrent parallelism.


Uses

  • module~~rdb_ocean_hdiff_tracer~~UsesGraph module~rdb_ocean_hdiff_tracer rdb_ocean_hdiff_tracer iso_fortran_env iso_fortran_env module~rdb_ocean_hdiff_tracer->iso_fortran_env module~rdb_constants rdb_constants module~rdb_ocean_hdiff_tracer->module~rdb_constants module~rdb_grid rdb_grid module~rdb_ocean_hdiff_tracer->module~rdb_grid module~rdb_mem_report rdb_mem_report module~rdb_ocean_hdiff_tracer->module~rdb_mem_report module~rdb_multilayer_state rdb_multilayer_state module~rdb_ocean_hdiff_tracer->module~rdb_multilayer_state module~rdb_ocean_boundary_types rdb_ocean_boundary_types module~rdb_ocean_hdiff_tracer->module~rdb_ocean_boundary_types module~rdb_ocean_metrics rdb_ocean_metrics module~rdb_ocean_hdiff_tracer->module~rdb_ocean_metrics module~rdb_scratch_3d rdb_scratch_3d module~rdb_ocean_hdiff_tracer->module~rdb_scratch_3d module~rdb_tracer rdb_tracer module~rdb_ocean_hdiff_tracer->module~rdb_tracer pic_types pic_types module~rdb_constants->pic_types module~rdb_grid->module~rdb_constants 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 module~rdb_multilayer_state->iso_fortran_env module~rdb_multilayer_state->module~rdb_constants module~rdb_multilayer_state->module~rdb_grid module~rdb_multilayer_state->module~rdb_mem_report module~rdb_multilayer_state->module~rdb_tracer module~rdb_efp rdb_efp module~rdb_multilayer_state->module~rdb_efp module~rdb_error_ring rdb_error_ring module~rdb_multilayer_state->module~rdb_error_ring module~rdb_multilayer_state->pic_logger module~rdb_ocean_boundary_types->iso_fortran_env module~rdb_ocean_boundary_types->module~rdb_constants module~rdb_ocean_boundary_types->module~rdb_grid module~rdb_ocean_boundary_types->module~rdb_mem_report module~rdb_ocean_status rdb_ocean_status module~rdb_ocean_boundary_types->module~rdb_ocean_status module~rdb_ocean_tide_astro rdb_ocean_tide_astro module~rdb_ocean_boundary_types->module~rdb_ocean_tide_astro pic_ascii pic_ascii module~rdb_ocean_boundary_types->pic_ascii module~rdb_ocean_boundary_types->pic_logger module~rdb_ocean_metrics->iso_fortran_env module~rdb_ocean_metrics->module~rdb_constants module~rdb_ocean_metrics->module~rdb_grid module~rdb_ocean_metrics->module~rdb_mem_report module~rdb_ocean_metrics->module~rdb_error_ring module~rdb_io_netcdf rdb_io_netcdf module~rdb_ocean_metrics->module~rdb_io_netcdf 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 module~rdb_ocean_metrics->module~rdb_ocean_status netcdf netcdf module~rdb_ocean_metrics->netcdf module~rdb_ocean_metrics->pic_logger module~rdb_ocean_metrics->pic_strings module~rdb_scratch_3d->iso_fortran_env module~rdb_scratch_3d->module~rdb_constants module~rdb_scratch_3d->module~rdb_mem_report module~rdb_tracer->iso_fortran_env module~rdb_tracer->module~rdb_constants module~rdb_tracer->module~rdb_grid module~rdb_tracer->module~rdb_mem_report module~rdb_efp->iso_fortran_env ieee_arithmetic ieee_arithmetic module~rdb_efp->ieee_arithmetic module~rdb_error_ring->pic_logger module~rdb_io_netcdf->iso_fortran_env 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_c_binding iso_c_binding module~rdb_io_netcdf->iso_c_binding module~rdb_ocean_bipolar->module~rdb_constants module~rdb_ocean_fold->module~rdb_constants module~rdb_ocean_tide_astro->iso_fortran_env module~rdb_ocean_tide_astro->module~rdb_constants

Used by

  • module~~rdb_ocean_hdiff_tracer~~UsedByGraph module~rdb_ocean_hdiff_tracer rdb_ocean_hdiff_tracer module~rdb_ocean_dyn rdb_ocean_dyn module~rdb_ocean_dyn->module~rdb_ocean_hdiff_tracer module~rdb_ocean_state rdb_ocean_state module~rdb_ocean_state->module~rdb_ocean_hdiff_tracer module~rdb_ocean_state->module~rdb_ocean_dyn module~rdb_driver rdb_driver module~rdb_driver->module~rdb_ocean_dyn 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_api rdb_ocean_api module~rdb_ocean_api->module~rdb_ocean_dyn module~rdb_ocean_api->module~rdb_handle module~rdb_ocean_diag_derived rdb_ocean_diag_derived module~rdb_ocean_api->module~rdb_ocean_diag_derived module~rdb_ocean_diag_fills rdb_ocean_diag_fills module~rdb_ocean_api->module~rdb_ocean_diag_fills module~rdb_ocean_api->module~rdb_ocean_engine 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_engine->module~rdb_ocean_dyn 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_dyn module~rdb_ocean_setup->module~rdb_ocean_state

Derived Types

type, public ::  ocean_hdiff_tracer_t

Components

Type Visibility Attributes Name Initial
type(scratch_3d_buffer_t), public :: F_x_face

East-face tracer flux kappa * h_face * dT/dx. Shape (nx+1, ny, nz_ml).

type(scratch_3d_buffer_t), public :: F_y_face

North-face counterpart. Shape (nx, ny+1, nz_ml).

type(scratch_3d_buffer_t), public :: T_centre

T = hTr/h at cell centres. Shape (nx, ny, nz_ml). Filled per tracer at the start of each impl call; reused across the F_x / F_y face passes so the divergence step reads a consistent snapshot.

logical, public :: is_init = .false.

True between init and destroy.

real(kind=wp), public :: kappa_h = 0.0_wp

Constant horizontal tracer diffusivity (m^2/s). Zero is a no-op โ€” the kernel short-circuits without touching hTr. Stability bound (explicit forward-Euler): kappa_h * dt * (1/dx^2 + 1/dy^2) <= 0.5

Type-Bound Procedures

procedure, public, non_overridable :: bytes => ocean_hdiff_tracer_bytes
procedure, public, non_overridable :: destroy => ocean_hdiff_tracer_destroy
procedure, public, non_overridable :: enter_data => ocean_hdiff_tracer_enter_data
procedure, public, non_overridable :: exit_data => ocean_hdiff_tracer_exit_data
procedure, public, non_overridable :: init => ocean_hdiff_tracer_init

Functions

private pure function ocean_hdiff_tracer_bytes(this) result(nbytes)

Counted allocatable footprint of the horizontal tracer diffusion slot (0 when unallocated).

Arguments

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

Return Value integer(kind=int64)


Subroutines

public subroutine tracer_hdiff(grid, metrics, this, ms, dt, active, bc)

Iterate the tracer registry and apply constant-kappa_h horizontal Laplacian diffusion to every tracer whose do_horizontal_diffusion flag is set. Outer-shim: forwards each tracer’s hTr to the flat-impl below. Reuses the same scratch buffers across all tracers in one call.

Read more…

Arguments

Type IntentOptional Attributes Name
type(hgrid_t), intent(in) :: grid
type(ocean_metrics_t), intent(in) :: metrics
type(ocean_hdiff_tracer_t), intent(inout) :: this
type(multilayer_state_t), intent(inout) :: ms
real(kind=wp), intent(in) :: dt
logical, intent(in), optional :: active
type(ocean_bc_state_t), intent(in), optional :: bc

private subroutine ocean_hdiff_tracer_destroy(this)

Arguments

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

private subroutine ocean_hdiff_tracer_enter_data(this)

Arguments

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

private subroutine ocean_hdiff_tracer_enter_data_impl(this)

Arguments

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

private subroutine ocean_hdiff_tracer_exit_data(this)

Arguments

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

private subroutine ocean_hdiff_tracer_exit_data_impl(this)

Arguments

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

private subroutine ocean_hdiff_tracer_init(this, grid, nz_ml)

Arguments

Type IntentOptional Attributes Name
class(ocean_hdiff_tracer_t), intent(inout) :: this
type(hgrid_t), intent(in) :: grid
integer, intent(in), optional :: nz_ml

private pure subroutine tracer_hdiff_one_impl(nx, ny, nz, nghost, nx_phys, ny_phys, dt, kappa, dy_cu, dx_cv, idxCu, idyCv, iareaT, h, hTr, T_centre, F_x_face, F_y_face, wall_w, wall_e, wall_s, wall_n, open_u, open_v, budget)

Four-pass flat-impl horizontal-Laplacian tracer diffusion in conservative curvilinear form (design ยง2, mirrors continuity):

Read more…

Arguments

Type IntentOptional Attributes Name
integer, intent(in) :: nx
integer, intent(in) :: ny
integer, intent(in) :: nz
integer, intent(in) :: nghost
integer, intent(in) :: nx_phys
integer, intent(in) :: ny_phys
real(kind=wp), intent(in) :: dt
real(kind=wp), intent(in) :: kappa
real(kind=wp), intent(in) :: dy_cu(nx+1,ny)
real(kind=wp), intent(in) :: dx_cv(nx,ny+1)
real(kind=wp), intent(in) :: idxCu(nx+1,ny)
real(kind=wp), intent(in) :: idyCv(nx,ny+1)
real(kind=wp), intent(in) :: iareaT(nx,ny)
real(kind=wp), intent(in) :: h(nx,ny,nz)
real(kind=wp), intent(inout) :: hTr(nx,ny,nz)
real(kind=wp), intent(inout) :: T_centre(nx,ny,nz)
real(kind=wp), intent(inout) :: F_x_face(nx+1,ny,nz)
real(kind=wp), intent(inout) :: F_y_face(nx,ny+1,nz)
logical, intent(in) :: wall_w
logical, intent(in) :: wall_e
logical, intent(in) :: wall_s
logical, intent(in) :: wall_n
real(kind=wp), intent(in), optional :: open_u(nx+1,ny,nz)

Per-layer 0/1 u-face open mask (&vcoord_nml zfixed_closed_faces). A CLOSED face is a z-level WALL for that layer, so it carries no diffusive tracer flux either โ€” the same statement continuity makes about mass.

Read more…
real(kind=wp), intent(in), optional :: open_v(nx,ny+1,nz)

v-face twin. Present iff open_u is.

real(kind=wp), intent(inout), optional :: budget(nx,ny,nz)