rdb_mem_report Module

Free procedures that estimate, log, and verify the device memory footprint of the simulation state before the OpenACC enter_data mapping is attempted — so an over-budget run reports a readable diagnostic instead of dying opaquely inside the CUDA runtime (the motivating failure: a 10M-cell ocean config that exhausted device memory at enter_data with no setup-time hint).

Design decision (no hand-maintained per-slot byte counts — those rot the moment a slot is added): the ONLY trustworthy figures are the OpenACC runtime’s own free-memory queries. The device footprint of the state mapping is measured, not estimated, as the drop in free device memory across enter_data (mem_log_state_budget snapshots free-before; mem_log_device_actuals reports the delta). Host RSS growth across state init is still logged, but ONLY as an advisory host-side figure + a conservative upper bound for the pre-flight OOM warning — it includes host-only allocations (NetCDF/HDF5 library pages, I/O buffers, host mirrors of the device arrays) and measured 6-31x larger than the true device map (2026-07 audit), so it must never be read as a device estimate.

Three structural offsets to keep in mind when reconciling these figures against nvidia-smi (audited 2026-07 on V100): 1. CUDA context + CUBIN load: ~300-500 MB per process, created at the first OpenACC API call / directive. It is inside used = total - free and inside nvidia-smi’s per-process figure, but is NOT state — a tiny config still shows ~300 MB in use. 2. Device-wide accounting + pool granularity: used = total - free counts EVERY process on the device (shared-device activity perturbs it and the measured mapping delta), and the NVHPC pool allocator rounds small maps up by a few MB. 3. One-off CUDA runtime/kernel reservation at first launch: the first time-loop step grows per-process device usage by GBs (measured: ~3.0 GB coastal, ~8.6 GB ocean on V100) — constant thereafter, independent of step count and of NV_ACC_MEM_MANAGE, and NOT proportional to grid size. Consistent with the driver’s local-memory/stack backing for stack-heavy kernels (fixed-size local() arrays), which scales with the binary’s kernels x device SM count. It is real per-process usage (visible in nvidia-smi) but is not a leak; the growth WARNING therefore measures against the steady post-first-sample baseline, not the post-enter_data one.

Post-setup growth (mem_log_device_growth) makes drift self-announcing: kernels that lazy-allocate device workspaces on first call (the coastal *_workspace_ensure pattern — measured at ~33% of the coastal device footprint) land AFTER enter_data, so the periodic status re-checks and the end-of-run summary reports the growth, warning above GROWTH_WARN_FRAC.

Device queries use the OpenACC property API (acc_get_property with acc_property_memory / acc_property_free_memory). They are compiled only when the OpenACC runtime module is available (RDB_HAS_OPENACC_RUNTIME, set by cmake/compiler_flags.cmake for NVHPC + Cray — covers both the -acc=gpu and -mp=gpu NVHPC backends). On every other toolchain (gfortran, ifx) the device functions return -1 and the loggers degrade to the host-only line.


Uses

  • module~~rdb_mem_report~~UsesGraph module~rdb_mem_report rdb_mem_report iso_fortran_env iso_fortran_env module~rdb_mem_report->iso_fortran_env module~rdb_constants rdb_constants 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 pic_types pic_types module~rdb_constants->pic_types

Used by

  • module~~rdb_mem_report~~UsedByGraph module~rdb_mem_report rdb_mem_report module~rdb_barotropic_state rdb_barotropic_state module~rdb_barotropic_state->module~rdb_mem_report module~rdb_barotropic_workstate rdb_barotropic_workstate module~rdb_barotropic_workstate->module~rdb_mem_report module~rdb_continuity rdb_continuity module~rdb_continuity->module~rdb_mem_report module~rdb_continuity->module~rdb_barotropic_state module~rdb_multilayer_state rdb_multilayer_state module~rdb_continuity->module~rdb_multilayer_state module~rdb_ocean_boundary_types rdb_ocean_boundary_types module~rdb_continuity->module~rdb_ocean_boundary_types module~rdb_ocean_gm rdb_ocean_gm module~rdb_continuity->module~rdb_ocean_gm module~rdb_ocean_metrics rdb_ocean_metrics module~rdb_continuity->module~rdb_ocean_metrics module~rdb_ocean_mle rdb_ocean_mle module~rdb_continuity->module~rdb_ocean_mle module~rdb_scratch_3d rdb_scratch_3d module~rdb_continuity->module~rdb_scratch_3d module~rdb_tracer rdb_tracer module~rdb_continuity->module~rdb_tracer module~rdb_ocean_fold_apply rdb_ocean_fold_apply module~rdb_continuity->module~rdb_ocean_fold_apply module~rdb_ocean_periodic rdb_ocean_periodic module~rdb_continuity->module~rdb_ocean_periodic module~rdb_ocean_halo rdb_ocean_halo module~rdb_continuity->module~rdb_ocean_halo module~rdb_coriolis_adv rdb_coriolis_adv module~rdb_coriolis_adv->module~rdb_mem_report module~rdb_coriolis_adv->module~rdb_barotropic_state module~rdb_coriolis_adv->module~rdb_multilayer_state module~rdb_coriolis_adv->module~rdb_ocean_metrics module~rdb_coriolis_adv->module~rdb_scratch_3d module~rdb_driver rdb_driver module~rdb_driver->module~rdb_mem_report module~rdb_ocean_dyn rdb_ocean_dyn module~rdb_driver->module~rdb_ocean_dyn module~rdb_ocean_console_stats rdb_ocean_console_stats module~rdb_driver->module~rdb_ocean_console_stats module~rdb_ocean_engine rdb_ocean_engine module~rdb_driver->module~rdb_ocean_engine module~rdb_ocean_state rdb_ocean_state module~rdb_driver->module~rdb_ocean_state module~rdb_config rdb_config module~rdb_driver->module~rdb_config module~rdb_ice_state rdb_ice_state module~rdb_ice_state->module~rdb_mem_report module~rdb_multilayer_state->module~rdb_mem_report module~rdb_multilayer_state->module~rdb_tracer module~rdb_ocean_bottom_drag rdb_ocean_bottom_drag module~rdb_ocean_bottom_drag->module~rdb_mem_report module~rdb_ocean_bottom_drag->module~rdb_multilayer_state module~rdb_ocean_bottom_drag->module~rdb_ocean_metrics module~rdb_ocean_bottom_drag->module~rdb_scratch_3d module~rdb_ocean_boundary_types->module~rdb_mem_report module~rdb_ocean_bt_wide rdb_ocean_bt_wide module~rdb_ocean_bt_wide->module~rdb_mem_report module~rdb_ocean_bt_wide->module~rdb_barotropic_workstate module~rdb_ocean_bt_wide->module~rdb_ocean_boundary_types module~rdb_ocean_bt_wide->module~rdb_ocean_metrics module~rdb_barotropic_substep rdb_barotropic_substep module~rdb_ocean_bt_wide->module~rdb_barotropic_substep module~rdb_ocean_bt_wide->module~rdb_ocean_halo module~rdb_ocean_budgets rdb_ocean_budgets module~rdb_ocean_budgets->module~rdb_mem_report module~rdb_ocean_budgets->module~rdb_multilayer_state module~rdb_ocean_diag_mask rdb_ocean_diag_mask module~rdb_ocean_budgets->module~rdb_ocean_diag_mask module~rdb_ocean_cavity_flux rdb_ocean_cavity_flux module~rdb_ocean_cavity_flux->module~rdb_mem_report module~rdb_ocean_cavity_flux->module~rdb_multilayer_state module~rdb_ocean_cavity_flux->module~rdb_ocean_metrics module~rdb_ocean_surface_flux rdb_ocean_surface_flux module~rdb_ocean_cavity_flux->module~rdb_ocean_surface_flux module~rdb_ocean_data_input rdb_ocean_data_input module~rdb_ocean_data_input->module~rdb_mem_report module~rdb_ocean_data_input->module~rdb_config module~rdb_ocean_diag rdb_ocean_diag module~rdb_ocean_diag->module~rdb_mem_report module~rdb_ocean_diag->module~rdb_ocean_diag_mask module~rdb_ocean_diag_mask->module~rdb_mem_report module~rdb_ocean_dyn->module~rdb_mem_report module~rdb_ocean_dyn->module~rdb_barotropic_state module~rdb_ocean_dyn->module~rdb_barotropic_workstate module~rdb_ocean_dyn->module~rdb_continuity module~rdb_ocean_dyn->module~rdb_coriolis_adv module~rdb_ocean_dyn->module~rdb_multilayer_state module~rdb_ocean_dyn->module~rdb_ocean_bottom_drag module~rdb_ocean_dyn->module~rdb_ocean_boundary_types module~rdb_ocean_dyn->module~rdb_ocean_bt_wide module~rdb_ocean_dyn->module~rdb_ocean_cavity_flux module~rdb_ocean_epbl rdb_ocean_epbl module~rdb_ocean_dyn->module~rdb_ocean_epbl module~rdb_ocean_dyn->module~rdb_ocean_gm module~rdb_ocean_hdiff_tracer rdb_ocean_hdiff_tracer module~rdb_ocean_dyn->module~rdb_ocean_hdiff_tracer module~rdb_ocean_horizontal_viscosity rdb_ocean_horizontal_viscosity module~rdb_ocean_dyn->module~rdb_ocean_horizontal_viscosity module~rdb_ocean_isopycnal_slopes rdb_ocean_isopycnal_slopes module~rdb_ocean_dyn->module~rdb_ocean_isopycnal_slopes module~rdb_ocean_kappa_shear rdb_ocean_kappa_shear module~rdb_ocean_dyn->module~rdb_ocean_kappa_shear module~rdb_ocean_lateral_mix rdb_ocean_lateral_mix module~rdb_ocean_dyn->module~rdb_ocean_lateral_mix module~rdb_ocean_meke rdb_ocean_meke module~rdb_ocean_dyn->module~rdb_ocean_meke module~rdb_ocean_dyn->module~rdb_ocean_metrics module~rdb_ocean_dyn->module~rdb_ocean_mle module~rdb_ocean_p_surf rdb_ocean_p_surf module~rdb_ocean_dyn->module~rdb_ocean_p_surf module~rdb_ocean_pressure_force rdb_ocean_pressure_force module~rdb_ocean_dyn->module~rdb_ocean_pressure_force module~rdb_ocean_redi rdb_ocean_redi module~rdb_ocean_dyn->module~rdb_ocean_redi module~rdb_ocean_sponge rdb_ocean_sponge module~rdb_ocean_dyn->module~rdb_ocean_sponge module~rdb_ocean_dyn->module~rdb_ocean_surface_flux module~rdb_ocean_surface_stress rdb_ocean_surface_stress module~rdb_ocean_dyn->module~rdb_ocean_surface_stress module~rdb_ocean_tidal_mixing rdb_ocean_tidal_mixing module~rdb_ocean_dyn->module~rdb_ocean_tidal_mixing module~rdb_ocean_tides rdb_ocean_tides module~rdb_ocean_dyn->module~rdb_ocean_tides module~rdb_ocean_top_drag rdb_ocean_top_drag module~rdb_ocean_dyn->module~rdb_ocean_top_drag module~rdb_ocean_varmix rdb_ocean_varmix module~rdb_ocean_dyn->module~rdb_ocean_varmix module~rdb_ocean_vcoord rdb_ocean_vcoord module~rdb_ocean_dyn->module~rdb_ocean_vcoord module~rdb_ocean_vdiff rdb_ocean_vdiff module~rdb_ocean_dyn->module~rdb_ocean_vdiff module~rdb_ocean_vertical_advection rdb_ocean_vertical_advection module~rdb_ocean_dyn->module~rdb_ocean_vertical_advection module~rdb_ocean_vmix rdb_ocean_vmix module~rdb_ocean_dyn->module~rdb_ocean_vmix module~rdb_ocean_wave_speed rdb_ocean_wave_speed module~rdb_ocean_dyn->module~rdb_ocean_wave_speed module~rdb_barotropic_coupling rdb_barotropic_coupling module~rdb_ocean_dyn->module~rdb_barotropic_coupling module~rdb_ocean_dyn->module~rdb_barotropic_substep module~rdb_ocean_bt_budget_probe rdb_ocean_bt_budget_probe module~rdb_ocean_dyn->module~rdb_ocean_bt_budget_probe module~rdb_ocean_chksum rdb_ocean_chksum module~rdb_ocean_dyn->module~rdb_ocean_chksum module~rdb_ocean_dyn->module~rdb_ocean_console_stats module~rdb_ocean_eos_compute rdb_ocean_eos_compute module~rdb_ocean_dyn->module~rdb_ocean_eos_compute module~rdb_ocean_dyn->module~rdb_ocean_fold_apply module~rdb_ocean_geothermal rdb_ocean_geothermal module~rdb_ocean_dyn->module~rdb_ocean_geothermal module~rdb_ocean_ghost_poison rdb_ocean_ghost_poison module~rdb_ocean_dyn->module~rdb_ocean_ghost_poison module~rdb_ocean_halo_state rdb_ocean_halo_state module~rdb_ocean_dyn->module~rdb_ocean_halo_state module~rdb_ocean_ideal_age rdb_ocean_ideal_age module~rdb_ocean_dyn->module~rdb_ocean_ideal_age module~rdb_ocean_ke_probe rdb_ocean_ke_probe module~rdb_ocean_dyn->module~rdb_ocean_ke_probe module~rdb_ocean_min_thickness rdb_ocean_min_thickness module~rdb_ocean_dyn->module~rdb_ocean_min_thickness module~rdb_ocean_obc_baroclinic rdb_ocean_obc_baroclinic module~rdb_ocean_dyn->module~rdb_ocean_obc_baroclinic module~rdb_ocean_dyn->module~rdb_ocean_periodic module~rdb_ocean_remap rdb_ocean_remap module~rdb_ocean_dyn->module~rdb_ocean_remap module~rdb_ocean_dyn->module~rdb_ocean_halo module~rdb_ocean_epbl->module~rdb_mem_report module~rdb_ocean_epbl->module~rdb_multilayer_state module~rdb_ocean_epbl->module~rdb_ocean_surface_flux module~rdb_ocean_epbl->module~rdb_ocean_surface_stress module~rdb_ocean_epbl->module~rdb_scratch_3d module~rdb_ocean_gm->module~rdb_mem_report module~rdb_ocean_gm->module~rdb_multilayer_state module~rdb_ocean_gm->module~rdb_ocean_isopycnal_slopes module~rdb_ocean_gm->module~rdb_ocean_metrics module~rdb_ocean_hdiff_tracer->module~rdb_mem_report module~rdb_ocean_hdiff_tracer->module~rdb_multilayer_state module~rdb_ocean_hdiff_tracer->module~rdb_ocean_boundary_types module~rdb_ocean_hdiff_tracer->module~rdb_ocean_metrics module~rdb_ocean_hdiff_tracer->module~rdb_scratch_3d module~rdb_ocean_hdiff_tracer->module~rdb_tracer module~rdb_ocean_horizontal_viscosity->module~rdb_mem_report module~rdb_ocean_horizontal_viscosity->module~rdb_multilayer_state module~rdb_ocean_horizontal_viscosity->module~rdb_ocean_lateral_mix module~rdb_ocean_horizontal_viscosity->module~rdb_ocean_metrics module~rdb_ocean_horizontal_viscosity->module~rdb_scratch_3d module~rdb_ocean_isopycnal_slopes->module~rdb_mem_report module~rdb_ocean_isopycnal_slopes->module~rdb_multilayer_state module~rdb_ocean_isopycnal_slopes->module~rdb_ocean_metrics module~rdb_ocean_kappa_shear->module~rdb_mem_report module~rdb_ocean_kappa_shear->module~rdb_multilayer_state module~rdb_ocean_lateral_mix->module~rdb_mem_report module~rdb_ocean_lateral_mix->module~rdb_multilayer_state module~rdb_ocean_lateral_mix->module~rdb_ocean_metrics module~rdb_ocean_lateral_mix->module~rdb_scratch_3d module~rdb_ocean_meke->module~rdb_mem_report module~rdb_ocean_meke->module~rdb_multilayer_state module~rdb_ocean_meke->module~rdb_ocean_gm module~rdb_ocean_meke->module~rdb_ocean_metrics module~rdb_ocean_meke->module~rdb_ocean_varmix module~rdb_ocean_meke->module~rdb_ocean_wave_speed module~rdb_ocean_metrics->module~rdb_mem_report module~rdb_ocean_mle->module~rdb_mem_report module~rdb_ocean_mle->module~rdb_multilayer_state module~rdb_ocean_mle->module~rdb_ocean_boundary_types module~rdb_ocean_mle->module~rdb_ocean_epbl module~rdb_ocean_mle->module~rdb_ocean_metrics module~rdb_ocean_mle->module~rdb_ocean_surface_stress module~rdb_ocean_obc rdb_ocean_obc module~rdb_ocean_obc->module~rdb_mem_report module~rdb_ocean_p_surf->module~rdb_mem_report module~rdb_ocean_pressure_force->module~rdb_mem_report module~rdb_ocean_pressure_force->module~rdb_multilayer_state module~rdb_ocean_pressure_force->module~rdb_ocean_metrics module~rdb_ocean_pressure_force->module~rdb_scratch_3d module~rdb_ocean_redi->module~rdb_mem_report module~rdb_ocean_redi->module~rdb_multilayer_state module~rdb_ocean_redi->module~rdb_ocean_boundary_types module~rdb_ocean_redi->module~rdb_ocean_metrics module~rdb_ocean_redi->module~rdb_tracer module~rdb_ocean_sponge->module~rdb_mem_report module~rdb_ocean_sponge->module~rdb_multilayer_state module~rdb_ocean_sponge->module~rdb_ocean_boundary_types 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_mem_report module~rdb_ocean_surface_stress->module~rdb_multilayer_state module~rdb_ocean_surface_stress->module~rdb_scratch_3d module~rdb_ocean_tidal_mixing->module~rdb_mem_report module~rdb_ocean_tidal_mixing->module~rdb_multilayer_state module~rdb_ocean_tides->module~rdb_mem_report module~rdb_ocean_top_drag->module~rdb_mem_report module~rdb_ocean_top_drag->module~rdb_multilayer_state module~rdb_ocean_top_drag->module~rdb_scratch_3d module~rdb_ocean_varmix->module~rdb_mem_report module~rdb_ocean_varmix->module~rdb_multilayer_state module~rdb_ocean_varmix->module~rdb_ocean_isopycnal_slopes module~rdb_ocean_varmix->module~rdb_ocean_metrics module~rdb_ocean_varmix->module~rdb_ocean_wave_speed module~rdb_ocean_vcoord->module~rdb_mem_report module~rdb_ocean_vdiff->module~rdb_mem_report module~rdb_ocean_vdiff->module~rdb_multilayer_state module~rdb_ocean_vdiff->module~rdb_scratch_3d module~rdb_ocean_vdiff->module~rdb_tracer module~rdb_ocean_vertical_advection->module~rdb_mem_report module~rdb_ocean_vertical_advection->module~rdb_multilayer_state module~rdb_ocean_vertical_advection->module~rdb_scratch_3d module~rdb_ocean_vertical_advection->module~rdb_tracer module~rdb_ocean_vmix->module~rdb_mem_report module~rdb_ocean_vmix->module~rdb_multilayer_state module~rdb_ocean_vmix->module~rdb_ocean_surface_flux module~rdb_ocean_vmix->module~rdb_ocean_surface_stress module~rdb_ocean_wave_speed->module~rdb_mem_report module~rdb_ocean_wave_speed->module~rdb_multilayer_state module~rdb_ocean_wave_speed->module~rdb_ocean_metrics module~rdb_scratch_3d->module~rdb_mem_report module~rdb_tracer->module~rdb_mem_report module~rdb_barotropic_coupling->module~rdb_barotropic_workstate module~rdb_barotropic_coupling->module~rdb_coriolis_adv module~rdb_barotropic_coupling->module~rdb_multilayer_state module~rdb_barotropic_coupling->module~rdb_ocean_bottom_drag module~rdb_barotropic_coupling->module~rdb_ocean_boundary_types module~rdb_barotropic_coupling->module~rdb_ocean_horizontal_viscosity module~rdb_barotropic_coupling->module~rdb_ocean_metrics 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_barotropic_substep->module~rdb_barotropic_workstate module~rdb_barotropic_substep->module~rdb_ocean_boundary_types module~rdb_barotropic_substep->module~rdb_ocean_metrics module~rdb_bt_cont_type rdb_bt_cont_type module~rdb_barotropic_substep->module~rdb_bt_cont_type module~rdb_barotropic_substep->module~rdb_ocean_halo module~rdb_bt_cont_type->module~rdb_barotropic_workstate module~rdb_ice_atm_forcing rdb_ice_atm_forcing module~rdb_ice_atm_forcing->module~rdb_ice_state module~rdb_ice_basal_flux rdb_ice_basal_flux module~rdb_ice_basal_flux->module~rdb_ice_state module~rdb_ice_basal_flux->module~rdb_multilayer_state module~rdb_ice_basal_flux->module~rdb_ocean_surface_flux module~rdb_ice_evp rdb_ice_evp module~rdb_ice_evp->module~rdb_ice_state module~rdb_ice_evp->module~rdb_multilayer_state module~rdb_ice_evp->module~rdb_ocean_boundary_types module~rdb_ice_evp->module~rdb_ocean_metrics module~rdb_ice_evp->module~rdb_ocean_periodic module~rdb_ice_evp->module~rdb_ocean_halo module~rdb_ice_frazil rdb_ice_frazil module~rdb_ice_frazil->module~rdb_multilayer_state module~rdb_ice_frazil->module~rdb_ocean_surface_flux module~rdb_ice_frazil_uptake rdb_ice_frazil_uptake module~rdb_ice_frazil_uptake->module~rdb_ice_state module~rdb_ice_frazil_uptake->module~rdb_multilayer_state module~rdb_ice_init rdb_ice_init module~rdb_ice_init->module~rdb_ice_state module~rdb_ice_init->module~rdb_multilayer_state module~rdb_ice_init->module~rdb_ocean_metrics module~rdb_ice_itd rdb_ice_itd module~rdb_ice_itd->module~rdb_ice_state module~rdb_ice_itd->module~rdb_multilayer_state module~rdb_ice_ocean_coupler rdb_ice_ocean_coupler module~rdb_ice_ocean_coupler->module~rdb_ice_state module~rdb_ice_ocean_coupler->module~rdb_ocean_boundary_types module~rdb_ice_ocean_coupler->module~rdb_ocean_metrics module~rdb_ice_ocean_coupler->module~rdb_ocean_surface_flux module~rdb_ice_ocean_coupler->module~rdb_ocean_surface_stress module~rdb_ice_ocean_coupler->module~rdb_ocean_halo_state module~rdb_ice_snow rdb_ice_snow module~rdb_ice_snow->module~rdb_ice_state module~rdb_ice_thermo_driver rdb_ice_thermo_driver module~rdb_ice_thermo_driver->module~rdb_ice_state module~rdb_ice_thermo_driver->module~rdb_multilayer_state module~rdb_ice_transport rdb_ice_transport module~rdb_ice_transport->module~rdb_continuity module~rdb_ice_transport->module~rdb_ice_state module~rdb_ice_transport->module~rdb_multilayer_state module~rdb_ice_transport->module~rdb_ocean_boundary_types module~rdb_ice_transport->module~rdb_ocean_metrics module~rdb_ice_transport->module~rdb_ice_itd module~rdb_ice_transport->module~rdb_ocean_halo_state module~rdb_ice_transport->module~rdb_ocean_halo module~rdb_ocean_api rdb_ocean_api module~rdb_ocean_api->module~rdb_ocean_dyn 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_api->module~rdb_ocean_eos_compute module~rdb_ocean_api->module~rdb_ocean_fold_apply module~rdb_ocean_halo_width rdb_ocean_halo_width module~rdb_ocean_api->module~rdb_ocean_halo_width module~rdb_ocean_api->module~rdb_ocean_periodic module~rdb_ocean_api->module~rdb_config module~rdb_handle rdb_handle module~rdb_ocean_api->module~rdb_handle module~rdb_ocean_boundary_data rdb_ocean_boundary_data module~rdb_ocean_boundary_data->module~rdb_ocean_boundary_types module~rdb_ocean_bt_budget_probe->module~rdb_barotropic_workstate module~rdb_ocean_bt_budget_probe->module~rdb_coriolis_adv module~rdb_ocean_bt_budget_probe->module~rdb_multilayer_state 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_chksum->module~rdb_barotropic_workstate module~rdb_ocean_chksum->module~rdb_multilayer_state module~rdb_ocean_console_stats->module~rdb_multilayer_state module~rdb_ocean_console_stats->module~rdb_ocean_metrics module~rdb_ocean_data_forcing rdb_ocean_data_forcing module~rdb_ocean_data_forcing->module~rdb_ocean_boundary_types module~rdb_ocean_data_forcing->module~rdb_ocean_data_input module~rdb_ocean_data_forcing->module~rdb_ocean_surface_flux module~rdb_ocean_data_forcing->module~rdb_ocean_surface_stress module~rdb_ocean_data_forcing->module~rdb_ocean_halo_state module~rdb_ocean_data_forcing->module~rdb_config module~rdb_ocean_diag_derived->module~rdb_ocean_diag module~rdb_ocean_diag_derived->module~rdb_ocean_diag_fills module~rdb_ocean_diag_derived->module~rdb_ocean_state module~rdb_ocean_diag_fills->module~rdb_ocean_diag module~rdb_ocean_diag_fills->module~rdb_ocean_vcoord module~rdb_ocean_pseudo_salt rdb_ocean_pseudo_salt module~rdb_ocean_diag_fills->module~rdb_ocean_pseudo_salt module~rdb_ocean_diag_fills->module~rdb_ocean_state module~rdb_ocean_diag_netcdf rdb_ocean_diag_netcdf module~rdb_ocean_diag_netcdf->module~rdb_ocean_diag module~rdb_ocean_engine->module~rdb_ocean_boundary_types module~rdb_ocean_engine->module~rdb_ocean_cavity_flux module~rdb_ocean_engine->module~rdb_ocean_data_input module~rdb_ocean_engine->module~rdb_ocean_diag module~rdb_ocean_engine->module~rdb_ocean_dyn module~rdb_ocean_engine->module~rdb_ocean_metrics module~rdb_ocean_engine->module~rdb_ocean_sponge module~rdb_ocean_engine->module~rdb_ocean_surface_flux module~rdb_ocean_engine->module~rdb_ocean_surface_stress module~rdb_ocean_engine->module~rdb_ocean_vcoord module~rdb_ocean_engine->module~rdb_ice_atm_forcing module~rdb_ocean_engine->module~rdb_ice_basal_flux module~rdb_ocean_engine->module~rdb_ice_evp module~rdb_ocean_engine->module~rdb_ice_frazil module~rdb_ocean_engine->module~rdb_ice_frazil_uptake module~rdb_ocean_engine->module~rdb_ice_init module~rdb_ocean_engine->module~rdb_ice_itd module~rdb_ocean_engine->module~rdb_ice_ocean_coupler module~rdb_ocean_engine->module~rdb_ice_snow module~rdb_ocean_engine->module~rdb_ice_thermo_driver module~rdb_ocean_engine->module~rdb_ice_transport module~rdb_ocean_engine->module~rdb_ocean_boundary_data module~rdb_ocean_engine->module~rdb_ocean_data_forcing module~rdb_ocean_engine->module~rdb_ocean_diag_derived module~rdb_ocean_engine->module~rdb_ocean_diag_fills module~rdb_ocean_engine->module~rdb_ocean_diag_netcdf module~rdb_ocean_engine->module~rdb_ocean_fold_apply module~rdb_ocean_engine->module~rdb_ocean_geothermal module~rdb_ocean_engine->module~rdb_ocean_halo_state module~rdb_ocean_engine->module~rdb_ocean_periodic module~rdb_ocean_setup rdb_ocean_setup module~rdb_ocean_engine->module~rdb_ocean_setup module~rdb_ocean_stability_audit rdb_ocean_stability_audit module~rdb_ocean_engine->module~rdb_ocean_stability_audit module~rdb_ocean_engine->module~rdb_ocean_state module~rdb_state rdb_state module~rdb_ocean_engine->module~rdb_state module~rdb_ocean_engine->module~rdb_config module~rdb_ocean_engine->module~rdb_ocean_halo module~rdb_decomp rdb_decomp module~rdb_ocean_engine->module~rdb_decomp module~rdb_ocean_eos_compute->module~rdb_multilayer_state module~rdb_ocean_fold_apply->module~rdb_multilayer_state module~rdb_ocean_fold_apply->module~rdb_ocean_boundary_types module~rdb_ocean_geothermal->module~rdb_multilayer_state module~rdb_ocean_geothermal->module~rdb_ocean_surface_flux module~rdb_ocean_ghost_poison->module~rdb_barotropic_workstate module~rdb_ocean_ghost_poison->module~rdb_multilayer_state module~rdb_ocean_ghost_poison->module~rdb_ocean_surface_stress module~rdb_ocean_halo_state->module~rdb_ice_state module~rdb_ocean_halo_state->module~rdb_multilayer_state module~rdb_ocean_halo_state->module~rdb_ocean_boundary_types module~rdb_ocean_halo_state->module~rdb_ocean_surface_stress module~rdb_ocean_halo_state->module~rdb_ocean_fold_apply module~rdb_ocean_halo_state->module~rdb_ocean_periodic module~rdb_ocean_halo_state->module~rdb_ocean_halo module~rdb_ocean_halo_width->module~rdb_coriolis_adv module~rdb_ocean_ideal_age->module~rdb_multilayer_state module~rdb_ocean_ke_probe->module~rdb_coriolis_adv module~rdb_ocean_ke_probe->module~rdb_multilayer_state module~rdb_ocean_ke_probe->module~rdb_ocean_metrics module~rdb_ocean_min_thickness->module~rdb_multilayer_state module~rdb_ocean_obc_baroclinic->module~rdb_barotropic_workstate module~rdb_ocean_obc_baroclinic->module~rdb_multilayer_state module~rdb_ocean_obc_baroclinic->module~rdb_ocean_boundary_types module~rdb_ocean_periodic->module~rdb_multilayer_state module~rdb_ocean_periodic->module~rdb_ocean_boundary_types module~rdb_ocean_pseudo_salt->module~rdb_multilayer_state module~rdb_ocean_remap->module~rdb_multilayer_state module~rdb_ocean_remap->module~rdb_ocean_vcoord module~rdb_ocean_remap->module~rdb_tracer module~rdb_ocean_setup->module~rdb_coriolis_adv module~rdb_ocean_setup->module~rdb_ocean_bottom_drag module~rdb_ocean_setup->module~rdb_ocean_boundary_types module~rdb_ocean_setup->module~rdb_ocean_dyn 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_metrics module~rdb_ocean_setup->module~rdb_ocean_p_surf module~rdb_ocean_setup->module~rdb_ocean_pressure_force module~rdb_ocean_setup->module~rdb_ocean_sponge module~rdb_ocean_setup->module~rdb_ocean_surface_flux module~rdb_ocean_setup->module~rdb_ocean_surface_stress module~rdb_ocean_setup->module~rdb_ocean_tides module~rdb_ocean_setup->module~rdb_ocean_top_drag module~rdb_ocean_setup->module~rdb_ocean_vcoord module~rdb_ocean_setup->module~rdb_ocean_vdiff module~rdb_ocean_setup->module~rdb_ocean_vmix module~rdb_ocean_setup->module~rdb_ocean_fold_apply module~rdb_ocean_setup->module~rdb_ocean_geothermal module~rdb_ocean_setup->module~rdb_ocean_halo_state module~rdb_ocean_setup->module~rdb_ocean_state module~rdb_ocean_setup->module~rdb_config module~rdb_ocean_setup->module~rdb_ocean_halo module~rdb_ocean_setup->module~rdb_decomp module~rdb_ocean_stability_audit->module~rdb_ocean_metrics module~rdb_ocean_stability_audit->module~rdb_config module~rdb_ocean_state->module~rdb_barotropic_state module~rdb_ocean_state->module~rdb_continuity module~rdb_ocean_state->module~rdb_coriolis_adv module~rdb_ocean_state->module~rdb_ice_state module~rdb_ocean_state->module~rdb_multilayer_state module~rdb_ocean_state->module~rdb_ocean_bottom_drag module~rdb_ocean_state->module~rdb_ocean_boundary_types module~rdb_ocean_state->module~rdb_ocean_cavity_flux module~rdb_ocean_state->module~rdb_ocean_data_input module~rdb_ocean_state->module~rdb_ocean_diag module~rdb_ocean_state->module~rdb_ocean_dyn module~rdb_ocean_state->module~rdb_ocean_epbl module~rdb_ocean_state->module~rdb_ocean_gm 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_isopycnal_slopes module~rdb_ocean_state->module~rdb_ocean_kappa_shear module~rdb_ocean_state->module~rdb_ocean_lateral_mix module~rdb_ocean_state->module~rdb_ocean_meke module~rdb_ocean_state->module~rdb_ocean_metrics module~rdb_ocean_state->module~rdb_ocean_mle module~rdb_ocean_state->module~rdb_ocean_obc module~rdb_ocean_state->module~rdb_ocean_p_surf module~rdb_ocean_state->module~rdb_ocean_pressure_force module~rdb_ocean_state->module~rdb_ocean_redi module~rdb_ocean_state->module~rdb_ocean_sponge module~rdb_ocean_state->module~rdb_ocean_surface_flux module~rdb_ocean_state->module~rdb_ocean_surface_stress module~rdb_ocean_state->module~rdb_ocean_tidal_mixing module~rdb_ocean_state->module~rdb_ocean_tides module~rdb_ocean_state->module~rdb_ocean_top_drag module~rdb_ocean_state->module~rdb_ocean_varmix module~rdb_ocean_state->module~rdb_ocean_vcoord module~rdb_ocean_state->module~rdb_ocean_vdiff module~rdb_ocean_state->module~rdb_ocean_vertical_advection module~rdb_ocean_state->module~rdb_ocean_vmix module~rdb_ocean_state->module~rdb_ocean_wave_speed module~rdb_ocean_state->module~rdb_ocean_data_forcing module~rdb_ocean_state->module~rdb_ocean_periodic module~rdb_ocean_state->module~rdb_ocean_pseudo_salt module~rdb_ocean_z_init rdb_ocean_z_init module~rdb_ocean_state->module~rdb_ocean_z_init module~rdb_ocean_state->module~rdb_config module~rdb_ocean_state->module~rdb_decomp module~rdb_ocean_z_init->module~rdb_multilayer_state module~rdb_ocean_z_init->module~rdb_config module~rdb_state->module~rdb_tracer module~rdb_state->module~rdb_config 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_boundary_types 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_surface_flux proc~validate_config->module~rdb_ocean_tidal_mixing proc~validate_config->module~rdb_ocean_top_drag proc~validate_config->module~rdb_ocean_vmix proc~validate_config->module~rdb_ocean_pseudo_salt module~rdb_config->module~rdb_ice_init module~rdb_handle->module~rdb_ocean_engine module~rdb_handle->module~rdb_ocean_state module~rdb_handle->module~rdb_config module~rdb_ocean_halo->module~rdb_ocean_periodic module~rdb_ocean_halo->module~rdb_decomp module~rdb_config_schema rdb_config_schema module~rdb_config_schema->module~rdb_config module~rdb_decomp->module~rdb_config module~rdb_halo rdb_halo module~rdb_halo->module~rdb_decomp module~rdb_ocean_fold_exchange rdb_ocean_fold_exchange module~rdb_ocean_fold_exchange->module~rdb_decomp module~rdb_ocean_restart_io rdb_ocean_restart_io module~rdb_ocean_restart_io->module~rdb_decomp

Variables

Type Visibility Attributes Name Initial
integer(kind=int64), private, parameter :: BYTES_PER_GIB = 1024_int64*1024_int64*1024_int64
integer(kind=int64), private, parameter :: BYTES_PER_KIB = 1024_int64
integer(kind=int64), private, parameter :: BYTES_PER_MIB = 1024_int64*1024_int64
integer(kind=int64), private, parameter :: COUNT_RECONCILE_FLOOR = 64_int64*1024_int64*1024_int64

Absolute slack (64 MiB) added to the reconciliation tolerance so tiny configs — where pool rounding dwarfs the relative margin — never trip the drift warning.

real(kind=wp), private, parameter :: COUNT_RECONCILE_FRAC = 0.25_wp

The measured enter_data mapping may exceed the COUNTED state footprint by this fraction (NVHPC pool granularity + any device-only scratch mapped alongside the state) before the reconciliation warns. Overshoot past it means the device mapped significantly more than every bytes() term accounts for — a state array is almost certainly missing from the count.

real(kind=wp), private, parameter :: GROWTH_WARN_FRAC = 0.15_wp

Device-memory growth above this fraction of the STEADY post-setup baseline (first post-setup sample — after the one-off first-launch reservation and lazy workspaces) triggers a one-shot logger warning — progressive growth (a leak) becomes self-announcing instead of silently skewing the setup-time report.

integer(kind=int64), private :: counted_state_bytes = -1_int64

Counted state-array footprint latched by mem_log_computed_budget (summed from every bytes() term BEFORE enter_data); reconciled against the measured mapping in mem_log_device_actuals. -1 = not counted this run.

integer(kind=int64), private :: free_before_map = -1_int64

Free device bytes just before enter_data (latched by mem_log_state_budget); baseline for the measured mapping delta.

logical, private :: growth_warned = .false.

One-shot latch so the growth warning doesn’t spam every status fire once the threshold is crossed.

integer(kind=int64), private :: used_after_map = -1_int64

Device bytes in use just after enter_data (latched by mem_log_device_actuals); baseline for the “grew ~X after setup” attribution line.

integer(kind=int64), private :: used_steady = -1_int64

Device bytes in use at the FIRST post-setup growth sample (first status fire or end of run) — after the one-off first-launch runtime reservation and the lazy kernel workspaces have landed. Baseline for the leak WARNING: growth past this is progressive, not the expected one-offs.


Interfaces

public interface arr_bytes

Byte footprint of an allocatable array (0 when unallocated), so a gated-off slot naturally contributes nothing to a counted total. The COUNTED companion to the runtime’s MEASURED free-memory delta: each *_state_t sums its own arrays through this, the driver reports the total before enter_data (works on CPU builds too, where there is no device query), and mem_log_device_actuals reconciles the count against the measured mapping — a state array added without a matching bytes() term makes the measured map exceed the count and self-announces the drift (the anti-rot guard for the otherwise rot-prone per-slot count).

  • private pure function arr_bytes_r1(a) result(b)

    Arguments

    Type IntentOptional Attributes Name
    real(kind=wp), intent(in), allocatable :: a(:)

    Return Value integer(kind=int64)

  • private pure function arr_bytes_r2(a) result(b)

    Arguments

    Type IntentOptional Attributes Name
    real(kind=wp), intent(in), allocatable :: a(:,:)

    Return Value integer(kind=int64)

  • private pure function arr_bytes_r3(a) result(b)

    Arguments

    Type IntentOptional Attributes Name
    real(kind=wp), intent(in), allocatable :: a(:,:,:)

    Return Value integer(kind=int64)

  • private pure function arr_bytes_r4(a) result(b)

    Arguments

    Type IntentOptional Attributes Name
    real(kind=wp), intent(in), allocatable :: a(:,:,:,:)

    Return Value integer(kind=int64)

  • private pure function arr_bytes_i1(a) result(b)

    Arguments

    Type IntentOptional Attributes Name
    integer, intent(in), allocatable :: a(:)

    Return Value integer(kind=int64)

  • private pure function arr_bytes_i2(a) result(b)

    Arguments

    Type IntentOptional Attributes Name
    integer, intent(in), allocatable :: a(:,:)

    Return Value integer(kind=int64)

  • private pure function arr_bytes_i3(a) result(b)

    Arguments

    Type IntentOptional Attributes Name
    integer, intent(in), allocatable :: a(:,:,:)

    Return Value integer(kind=int64)

  • private pure function arr_bytes_l1(a) result(b)

    Arguments

    Type IntentOptional Attributes Name
    logical, intent(in), allocatable :: a(:)

    Return Value integer(kind=int64)

  • private pure function arr_bytes_l2(a) result(b)

    Arguments

    Type IntentOptional Attributes Name
    logical, intent(in), allocatable :: a(:,:)

    Return Value integer(kind=int64)

  • private pure function arr_bytes_l3(a) result(b)

    Arguments

    Type IntentOptional Attributes Name
    logical, intent(in), allocatable :: a(:,:,:)

    Return Value integer(kind=int64)


Functions

public function mem_device_free_bytes() result(bytes)

Free memory on the bound device, in bytes. Returns -1 when no OpenACC runtime is present.

Arguments

None

Return Value integer(kind=int64)

public function mem_device_total_bytes() result(bytes)

Total memory of the device that the OpenACC runtime is bound to, in bytes. Returns -1 when no OpenACC runtime is present (CPU / gfortran / ifx builds).

Arguments

None

Return Value integer(kind=int64)

public function mem_device_used_bytes() result(bytes)

Device memory currently in use, in bytes (total - free). DEVICE-WIDE: includes this process’s CUDA context (~300-500 MB) and every other process on a shared device — see the module header’s structural offsets. Returns -1 when no OpenACC runtime is present.

Arguments

None

Return Value integer(kind=int64)

public pure function mem_format_bytes(bytes) result(str)

Human-readable byte count: two decimals, GB at/above 1 GiB, MB below. Used for every figure in the budget log so the units stay consistent.

Arguments

Type IntentOptional Attributes Name
integer(kind=int64), intent(in) :: bytes

Return Value character(len=:), allocatable

public function mem_host_rss_bytes() result(bytes)

Resident set size of the current process, in bytes, parsed from VmRSS in /proc/self/status (reported in kB → scaled to bytes). Returns -1 if the file is unreadable or the field is absent (non-Linux platforms). Never aborts.

Arguments

None

Return Value integer(kind=int64)

private pure function arr_bytes_i1(a) result(b)

Arguments

Type IntentOptional Attributes Name
integer, intent(in), allocatable :: a(:)

Return Value integer(kind=int64)

private pure function arr_bytes_i2(a) result(b)

Arguments

Type IntentOptional Attributes Name
integer, intent(in), allocatable :: a(:,:)

Return Value integer(kind=int64)

private pure function arr_bytes_i3(a) result(b)

Arguments

Type IntentOptional Attributes Name
integer, intent(in), allocatable :: a(:,:,:)

Return Value integer(kind=int64)

private pure function arr_bytes_l1(a) result(b)

Arguments

Type IntentOptional Attributes Name
logical, intent(in), allocatable :: a(:)

Return Value integer(kind=int64)

private pure function arr_bytes_l2(a) result(b)

Arguments

Type IntentOptional Attributes Name
logical, intent(in), allocatable :: a(:,:)

Return Value integer(kind=int64)

private pure function arr_bytes_l3(a) result(b)

Arguments

Type IntentOptional Attributes Name
logical, intent(in), allocatable :: a(:,:,:)

Return Value integer(kind=int64)

private pure function arr_bytes_r1(a) result(b)

Arguments

Type IntentOptional Attributes Name
real(kind=wp), intent(in), allocatable :: a(:)

Return Value integer(kind=int64)

private pure function arr_bytes_r2(a) result(b)

Arguments

Type IntentOptional Attributes Name
real(kind=wp), intent(in), allocatable :: a(:,:)

Return Value integer(kind=int64)

private pure function arr_bytes_r3(a) result(b)

Arguments

Type IntentOptional Attributes Name
real(kind=wp), intent(in), allocatable :: a(:,:,:)

Return Value integer(kind=int64)

private pure function arr_bytes_r4(a) result(b)

Arguments

Type IntentOptional Attributes Name
real(kind=wp), intent(in), allocatable :: a(:,:,:,:)

Return Value integer(kind=int64)

private function device_num() result(num)

Active OpenACC device number, or -1 on CPU builds. Kept private — only the budget logger needs it.

Arguments

None

Return Value integer

private pure function two_dp(x) result(str)

Format a real to exactly two decimal places without leading blanks (write with an f edit descriptor, then adjustl + trim).

Arguments

Type IntentOptional Attributes Name
real(kind=wp), intent(in) :: x

Return Value character(len=:), allocatable


Subroutines

public subroutine mem_log_computed_budget(label, total_bytes)

Log the COUNTED state-array footprint. Unlike the RSS figure (host-only I/O buffers + library pages) and the device query (needs an OpenACC runtime), this is an exact sum of the state’s allocatable arrays — available on every toolchain, so a CPU build gets a real footprint line too. Latching for the reconciliation is mem_set_counted_budget (separate, so the print can move to the banner while the latch stays before enter_data).

Arguments

Type IntentOptional Attributes Name
character(len=*), intent(in) :: label
integer(kind=int64), intent(in) :: total_bytes

public subroutine mem_log_computed_line(label, bytes)

Log one indented breakdown line for a component of the counted footprint (barotropic / layers / closures / …). Skipped when the component is empty so gated-off slots don’t clutter the report.

Arguments

Type IntentOptional Attributes Name
character(len=*), intent(in) :: label
integer(kind=int64), intent(in) :: bytes

public subroutine mem_log_device_actuals(label)

Log actual device memory after enter_data: the device-wide usage (used = total - free — includes the CUDA context and any other process on a shared device) plus the MEASURED state mapping delta (free-before-mapping minus free-now; accurate to NVHPC pool granularity, ~a few MB). Latches the post-mapping usage as the baseline for mem_log_device_growth. Silent no-op when device queries are unavailable (CPU build).

Arguments

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

public subroutine mem_log_device_growth(label, quiet)

Report device-memory growth since the post-enter_data baseline. Two allocations land AFTER the setup-time report and would otherwise stay invisible: the lazy first-call kernel workspaces (*_workspace_ensure, ~33% of the coastal device footprint) and the one-off CUDA runtime/kernel reservation at first launch (GBs — module-header offset 3). Call this in the end-of-run summary (prints usage + the “grew ~X after setup” attribution, so even a 10-step run shows the true footprint) and at the periodic status with quiet=.true. (no info lines). The one-shot leak WARNING measures PROGRESSIVE growth — past GROWTH_WARN_FRAC of the steady baseline latched at the first post-setup sample — so the expected one-offs never trip it. Silent no-op on CPU builds or when the baseline was never latched.

Arguments

Type IntentOptional Attributes Name
character(len=*), intent(in) :: label
logical, intent(in), optional :: quiet

public subroutine mem_log_state_budget(label, host_growth_bytes)

Log the pre-mapping memory budget. Always logs the host-side allocation growth (ADVISORY — includes host-only I/O buffers + library pages, NOT a device estimate); when the device queries succeed it also logs the device number + free/total and latches the free-memory snapshot that mem_log_device_actuals turns into the measured mapping delta. Warns when the host growth (a conservative upper bound on what enter_data can map) exceeds 95% of free device memory — the regime where enter_data is likely to abort.

Arguments

Type IntentOptional Attributes Name
character(len=*), intent(in) :: label
integer(kind=int64), intent(in) :: host_growth_bytes

public subroutine mem_set_counted_budget(total_bytes)

Latch the COUNTED state-array footprint for the enter_data reconciliation, WITHOUT logging. Must run before mem_log_device_actuals (the reconciliation reads this), even when the human-readable budget is printed later (e.g. folded into the driver’s post-setup banner). total_bytes is the sum of every state bytes() term (0 for gated-off slots).

Arguments

Type IntentOptional Attributes Name
integer(kind=int64), intent(in) :: total_bytes