rdb_ocean_halo_width Module

Roundabout has (at the time of writing) six independent minimum-nghost rules spread across five files, each enforced at its own call site in rdb_config.F90/rdb_ocean_boundary_types.F90/rdb_ocean_halo.F90/ rdb_ocean_setup.F90. A Python caller building a grid in memory (docs/ocean_python_api_plan.md S5b) needs to be able to ask “how wide must my halo be” WITHOUT reproducing that scatter — the model Oceananigans uses is a per-scheme trait folded by max() over every tendency term (inflate_halo_size, automatic_halo_sizing.jl:73-81; 06_python_surface_design.md B2.4). required_halo below is that fold, reusing the EXISTING per-rule functions (pv_adv_required_nghost, tracer_recon_required_nghost) rather than re-deriving their numbers, so this module and the enforcement sites it does not replace can never silently disagree.

Two deliberate departures from Oceananigans, both already Roundabout’s existing policy and kept here on purpose (06_python_surface_design.md B2.4): fail loud, never silently inflate the halo or downgrade a scheme’s order to fit a small grid — required_halo only ADVISES the minimum; the fail-loud enforcement stays exactly where it already is (rdb_config.F90’s validate_config, ocean_bc_validate_periodic, ocean_bc_validate_fold, ocean_halo_init, configure_ocean_kappa_shear or equivalent) — this module does not remove or duplicate any of that enforcement.

The six rules folded here: 1. global floor 1 (rdb_config.F90 nghost >= 1) 2. PV-advection weno5/weno7 4/5 (rdb_coriolis_adv::pv_adv_required_nghost) 3. tracer reconstruction weno5/7/9 3/4/5 (rdb_recon_weno::tracer_recon_required_nghost) 4. any PERIODIC topology 3 (rdb_ocean_boundary_types::ocean_bc_validate_periodic) 5. tripolar north fold 3 (rdb_ocean_boundary_types::ocean_bc_validate_fold) 6. MPI-decomposed run 3 (rdb_ocean_halo halo-exchange stencil depth) (+) kappa-shear at_vertex 2 (rdb_ocean_setup::configure_ocean_kappa_shear)


Uses

  • module~~rdb_ocean_halo_width~~UsesGraph module~rdb_ocean_halo_width rdb_ocean_halo_width module~rdb_coriolis_adv rdb_coriolis_adv module~rdb_ocean_halo_width->module~rdb_coriolis_adv module~rdb_recon_weno rdb_recon_weno module~rdb_ocean_halo_width->module~rdb_recon_weno iso_fortran_env iso_fortran_env module~rdb_coriolis_adv->iso_fortran_env module~rdb_barotropic_state rdb_barotropic_state module~rdb_coriolis_adv->module~rdb_barotropic_state module~rdb_constants rdb_constants module~rdb_coriolis_adv->module~rdb_constants module~rdb_grid rdb_grid module~rdb_coriolis_adv->module~rdb_grid module~rdb_mem_report rdb_mem_report module~rdb_coriolis_adv->module~rdb_mem_report module~rdb_multilayer_state rdb_multilayer_state module~rdb_coriolis_adv->module~rdb_multilayer_state module~rdb_ocean_metrics rdb_ocean_metrics module~rdb_coriolis_adv->module~rdb_ocean_metrics module~rdb_ocean_porous rdb_ocean_porous module~rdb_coriolis_adv->module~rdb_ocean_porous module~rdb_scratch_3d rdb_scratch_3d module~rdb_coriolis_adv->module~rdb_scratch_3d module~rdb_recon_weno->module~rdb_constants module~rdb_recon_weno->module~rdb_grid module~rdb_barotropic_state->iso_fortran_env module~rdb_barotropic_state->module~rdb_constants module~rdb_barotropic_state->module~rdb_grid module~rdb_barotropic_state->module~rdb_mem_report 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_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_tracer rdb_tracer module~rdb_multilayer_state->module~rdb_tracer module~rdb_multilayer_state->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_status rdb_ocean_status 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_ocean_porous->module~rdb_constants ieee_arithmetic ieee_arithmetic module~rdb_ocean_porous->ieee_arithmetic module~rdb_scratch_3d->iso_fortran_env module~rdb_scratch_3d->module~rdb_constants module~rdb_scratch_3d->module~rdb_mem_report module~rdb_efp->iso_fortran_env 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_tracer->iso_fortran_env module~rdb_tracer->module~rdb_constants module~rdb_tracer->module~rdb_grid module~rdb_tracer->module~rdb_mem_report

Used by

  • module~~rdb_ocean_halo_width~~UsedByGraph module~rdb_ocean_halo_width rdb_ocean_halo_width module~rdb_ocean_api rdb_ocean_api module~rdb_ocean_api->module~rdb_ocean_halo_width

Variables

Type Visibility Attributes Name Initial
integer, private, parameter :: REQUIRED_HALO_DECOMPOSED = 3

Minimum nghost for an MPI-decomposed (multi-rank) run (rule 6).

integer, private, parameter :: REQUIRED_HALO_FLOOR = 1

Global minimum nghost regardless of scheme (rule 1).

integer, private, parameter :: REQUIRED_HALO_KAPPA_SHEAR_VERTEX = 2

Minimum nghost for kappa-shear’s opt-in vertex form (&ocean_kappa_shear_nml at_vertex = .true.).

integer, private, parameter :: REQUIRED_HALO_PERIODIC = 3

Minimum nghost for any periodic axis (rule 4) — PPM 5-point + biharmonic stencil depth.

integer, private, parameter :: REQUIRED_HALO_TRIPOLAR_FOLD = 3

Minimum nghost for the tripolar north fold (rule 5) — same stencil-depth requirement as periodic (the fold implies periodic west/east).


Functions

public pure function required_halo(pv_adv_scheme, tracer_recon, periodic, tripolar_fold, decomposed, kappa_shear_at_vertex) result(ng)

max() over every rule that applies to the given scheme selection — the minimum nghost a grid must carry. Every argument is optional; an absent selector contributes its BASELINE (2, the centered/PPM/non-periodic/single-rank floor), an absent logical contributes nothing (as if .false.).

Arguments

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

&ocean_coriolis_nml pv_adv_scheme string (“centered”, “weno3”, “weno5”, “weno7”). Unrecognised/absent -> baseline (2).

character(len=*), intent(in), optional :: tracer_recon

&ocean_tracers_nml recon-style string (“ppm”, “weno5”, “weno7”, “weno9”). Unrecognised/absent -> baseline (2).

logical, intent(in), optional :: periodic

.true. if EITHER grid axis is periodic (rule 4).

logical, intent(in), optional :: tripolar_fold

.true. for a tripolar north-fold grid (rule 5).

logical, intent(in), optional :: decomposed

.true. for a multi-rank (MPI-decomposed) run (rule 6).

logical, intent(in), optional :: kappa_shear_at_vertex

.true. when &ocean_kappa_shear_nml at_vertex = .true..

Return Value integer