ocean_dyn_step Subroutine

public subroutine ocean_dyn_step(grid, metrics, dyn, eos, cor, ct, pgf, hv, bd, ss, va, hd, vd, vmix, ms, dt, sf, geo, lateral_mix, epbl, kshear, slopes, vmix_tidal, bc, t, td, cav)

Multilayer extension of ocean_dyn_step_barotropic. One SSP-RK2 outer step that orchestrates the full per-layer dynamical core:

EOS → continuity-PPM → Sadourny Coriolis-adv → Mont pressure-force → Laplacian hvisc → bottom drag → surface stress → horizontal tracer advection → diagnose w → vertical tracer advection (Eulerian z) → applies

Each stage runs every compute kernel in sequence, then the apply step. The two SSP-RK2 stages save the prognostic state into the *_0 buffers (h_layer0, u_face_x_layer0, v_face_y_layer0, plus hTr0 on every registered tracer), run two full FE substeps, and average with the saved state to recover the second-order-accurate result.

The Coriolis parameter lives on the coriolis_adv_t slot as f_corner(:, :) (C-grid corners). Defaults to a uniform f_0 at init; call cor%set_beta_plane(grid, f_0, beta, y_ref) for the beta-plane variant f(y) = f_0 + beta*(y - y_ref).

Caller passes the individual slots rather than the full ocean_state_t to avoid a circular module dependency (rdb_ocean_state already uses rdb_ocean_dyn).

Arguments

Type IntentOptional Attributes Name
type(hgrid_t), intent(in) :: grid
type(ocean_metrics_t), intent(in) :: metrics

Curvilinear horizontal metrics — forwarded to the PGF (and, in slice 2, the other geometry-aware kernels).

type(ocean_dyn_t), intent(inout) :: dyn
type(eos_t), intent(in) :: eos
type(coriolis_adv_t), intent(inout) :: cor
type(continuity_t), intent(inout) :: ct
type(ocean_pressure_force_t), intent(inout) :: pgf
type(ocean_horizontal_viscosity_t), intent(inout) :: hv
type(ocean_bottom_drag_t), intent(inout) :: bd
type(ocean_surface_stress_t), intent(inout) :: ss
type(ocean_vertical_advection_t), intent(inout) :: va
type(ocean_hdiff_tracer_t), intent(inout) :: hd
type(ocean_vdiff_t), intent(inout) :: vd
type(ocean_vmix_t), intent(inout) :: vmix
type(multilayer_state_t), intent(inout) :: ms
real(kind=wp), intent(in) :: dt
type(ocean_surface_flux_t), intent(in), optional :: sf
type(ocean_geothermal_t), intent(in), optional :: geo

Geothermal bottom-heat-flux slot. Absent or enable=.false. preserves the historical no-geothermal path bit-identically.

type(ocean_lateral_mix_t), intent(inout), optional :: lateral_mix
type(ocean_epbl_t), intent(inout), optional :: epbl

Energetics-based PBL slot. Absent or enable=.false. preserves the historical PP81/KPP path bit-identically.

type(ocean_kappa_shear_t), intent(inout), optional :: kshear

Kappa-shear interior closure slot. Absent or enable=.false. preserves the historical path bit-identically.

type(ocean_slopes_t), intent(inout), optional :: slopes

Isopycnal-slope diagnostic slot. Absent or enable=.false. preserves the historical path bit-identically (diagnostic only — never feeds back into prognostics).

type(ocean_tidal_mixing_t), intent(inout), optional :: vmix_tidal

Tidal-mixing interior closure slot. Absent or enable=.false. preserves the historical path bit-identically.

type(ocean_bc_state_t), intent(in), optional :: bc

Boundary state — forwarded ONLY to the windowed tracer-advect drain so its single-rank periodic-x / north-fold seam wraps fire for periodic unsplit runs at dt_tracer_advect_ratio > 1. Absent ⇒ wall seams (the historical unsplit default); ratio = 1 never drains so this is inert there (bit-identical).

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

Model time (s) since run start, used to evaluate the ideal-age vintage-mode surface value (PR-7). Mirrors the split driver’s t dummy (ocean_dyn_step_split). Absent ⇒ t = 0.

type(ocean_top_drag_t), intent(inout), optional :: td

Ice-shelf TOP-drag slot (&ocean_tdrag_nml). OPTIONAL so the many direct ocean_dyn_step* / run_stage* call sites in the test suite need no churn; the production driver always passes it. Absent, or present and disabled, => no kernel launch and a bit-identical step.

type(ocean_cavity_flux_t), intent(inout), optional :: cav

Ice-shelf basal-melt slot (&ocean_cavity_melt_nml). OPTIONAL for the same reason td is: the direct ocean_dyn_step* / run_stage* call sites in the test suite need no churn, and the production driver always passes it. Absent, disabled, or freshwater="virtual" => no kernel launch and a bit-identical step. It is threaded down here rather than acted on in engine_step_finalize because the real-freshwater volume must be spent in the SAME stage, at the SAME stage weight and from the SAME melt value as the salt and heat halves the surface-flux apply spends – see ocean_cavity_mass_step’s docstring.


Calls

proc~~ocean_dyn_step~~CallsGraph proc~ocean_dyn_step ocean_dyn_step proc~apply_velocity_truncation apply_velocity_truncation proc~ocean_dyn_step->proc~apply_velocity_truncation proc~check_h_positive_or_die check_h_positive_or_die proc~ocean_dyn_step->proc~check_h_positive_or_die proc~continuity_tracer_drain continuity_tracer_drain proc~ocean_dyn_step->proc~continuity_tracer_drain proc~copy_field_3d copy_field_3d proc~ocean_dyn_step->proc~copy_field_3d proc~mask_layer_velocities mask_layer_velocities proc~ocean_dyn_step->proc~mask_layer_velocities proc~ocean_dyn_is_thermo_step ocean_dyn_t%ocean_dyn_is_thermo_step proc~ocean_dyn_step->proc~ocean_dyn_is_thermo_step proc~ocean_dyn_is_tracer_advect_step ocean_dyn_t%ocean_dyn_is_tracer_advect_step proc~ocean_dyn_step->proc~ocean_dyn_is_tracer_advect_step proc~ocean_ideal_age_reset_surface ocean_ideal_age_reset_surface proc~ocean_dyn_step->proc~ocean_ideal_age_reset_surface proc~ocean_ideal_age_young_val ocean_ideal_age_young_val proc~ocean_dyn_step->proc~ocean_ideal_age_young_val proc~rk2_average rk2_average proc~ocean_dyn_step->proc~rk2_average proc~rk2_average_field_3d rk2_average_field_3d proc~ocean_dyn_step->proc~rk2_average_field_3d proc~run_stage run_stage proc~ocean_dyn_step->proc~run_stage proc~save_state save_state proc~ocean_dyn_step->proc~save_state proc~vdiff_set_viscous_bbl vdiff_set_viscous_bbl proc~ocean_dyn_step->proc~vdiff_set_viscous_bbl local local proc~apply_velocity_truncation->local proc~apply_maxvel_clamp apply_maxvel_clamp proc~apply_velocity_truncation->proc~apply_maxvel_clamp proc~drain_avail_limit drain_avail_limit proc~continuity_tracer_drain->proc~drain_avail_limit proc~drain_avail_scale_x drain_avail_scale_x proc~continuity_tracer_drain->proc~drain_avail_scale_x proc~drain_avail_scale_y drain_avail_scale_y proc~continuity_tracer_drain->proc~drain_avail_scale_y proc~drain_copy_3d drain_copy_3d proc~continuity_tracer_drain->proc~drain_copy_3d proc~drain_fill_conc drain_fill_conc proc~continuity_tracer_drain->proc~drain_fill_conc proc~drain_limit_x drain_limit_x proc~continuity_tracer_drain->proc~drain_limit_x proc~drain_limit_y drain_limit_y proc~continuity_tracer_drain->proc~drain_limit_y proc~drain_parabola_x drain_parabola_x proc~continuity_tracer_drain->proc~drain_parabola_x proc~drain_parabola_y drain_parabola_y proc~continuity_tracer_drain->proc~drain_parabola_y proc~drain_reconstruct_hprev drain_reconstruct_hprev proc~continuity_tracer_drain->proc~drain_reconstruct_hprev proc~drain_rescale_htr drain_rescale_hTr proc~continuity_tracer_drain->proc~drain_rescale_htr proc~drain_rescale_htr_budget drain_rescale_hTr_budget proc~continuity_tracer_drain->proc~drain_rescale_htr_budget proc~drain_subtract_3d drain_subtract_3d proc~continuity_tracer_drain->proc~drain_subtract_3d proc~drain_swept_flux_x drain_swept_flux_x proc~continuity_tracer_drain->proc~drain_swept_flux_x proc~drain_swept_flux_x_weno drain_swept_flux_x_weno proc~continuity_tracer_drain->proc~drain_swept_flux_x_weno proc~drain_swept_flux_y drain_swept_flux_y proc~continuity_tracer_drain->proc~drain_swept_flux_y proc~drain_swept_flux_y_weno drain_swept_flux_y_weno proc~continuity_tracer_drain->proc~drain_swept_flux_y_weno proc~drain_update_h_x drain_update_h_x proc~continuity_tracer_drain->proc~drain_update_h_x proc~drain_update_h_y drain_update_h_y proc~continuity_tracer_drain->proc~drain_update_h_y proc~drain_update_tracer_x drain_update_tracer_x proc~continuity_tracer_drain->proc~drain_update_tracer_x proc~drain_update_tracer_x_budget drain_update_tracer_x_budget proc~continuity_tracer_drain->proc~drain_update_tracer_x_budget proc~drain_update_tracer_y drain_update_tracer_y proc~continuity_tracer_drain->proc~drain_update_tracer_y proc~drain_update_tracer_y_budget drain_update_tracer_y_budget proc~continuity_tracer_drain->proc~drain_update_tracer_y_budget proc~drain_wrap_centre drain_wrap_centre proc~continuity_tracer_drain->proc~drain_wrap_centre proc~drain_wrap_face_x drain_wrap_face_x proc~continuity_tracer_drain->proc~drain_wrap_face_x proc~drain_wrap_face_y drain_wrap_face_y proc~continuity_tracer_drain->proc~drain_wrap_face_y proc~drain_zero_3d drain_zero_3d proc~continuity_tracer_drain->proc~drain_zero_3d proc~ocean_halo_is_decomposed_x ocean_halo_is_decomposed_x proc~continuity_tracer_drain->proc~ocean_halo_is_decomposed_x proc~ocean_halo_is_decomposed_y ocean_halo_is_decomposed_y proc~continuity_tracer_drain->proc~ocean_halo_is_decomposed_y reduce reduce proc~continuity_tracer_drain->reduce proc~ocean_ideal_age_reset_step ocean_ideal_age_reset_step proc~ocean_ideal_age_reset_surface->proc~ocean_ideal_age_reset_step proc~run_stage->proc~ocean_dyn_is_thermo_step proc~apply_sw_and_restore apply_sw_and_restore proc~run_stage->proc~apply_sw_and_restore proc~compute_w_from_continuity compute_w_from_continuity proc~run_stage->proc~compute_w_from_continuity proc~continuity_tracer_step_split continuity_tracer_step_split proc~run_stage->proc~continuity_tracer_step_split proc~coriolis_adv_apply_tendencies coriolis_adv_apply_tendencies proc~run_stage->proc~coriolis_adv_apply_tendencies proc~coriolis_adv_compute_tendencies coriolis_adv_compute_tendencies proc~run_stage->proc~coriolis_adv_compute_tendencies proc~ocean_accumulate_mass_out ocean_accumulate_mass_out proc~run_stage->proc~ocean_accumulate_mass_out proc~ocean_bottom_drag_apply_tendencies ocean_bottom_drag_apply_tendencies proc~run_stage->proc~ocean_bottom_drag_apply_tendencies proc~ocean_bottom_drag_compute_tendencies ocean_bottom_drag_compute_tendencies proc~run_stage->proc~ocean_bottom_drag_compute_tendencies proc~ocean_cavity_mass_step ocean_cavity_mass_step proc~run_stage->proc~ocean_cavity_mass_step proc~ocean_channel_drag_apply_tendencies ocean_channel_drag_apply_tendencies proc~run_stage->proc~ocean_channel_drag_apply_tendencies proc~ocean_channel_drag_compute_tendencies ocean_channel_drag_compute_tendencies proc~run_stage->proc~ocean_channel_drag_compute_tendencies proc~ocean_dyn_therm_dt ocean_dyn_t%ocean_dyn_therm_dt proc~run_stage->proc~ocean_dyn_therm_dt proc~ocean_eos_compute ocean_eos_compute proc~run_stage->proc~ocean_eos_compute proc~ocean_geothermal_apply_tracers ocean_geothermal_apply_tracers proc~run_stage->proc~ocean_geothermal_apply_tracers proc~ocean_horizontal_viscosity_apply_tendencies ocean_horizontal_viscosity_apply_tendencies proc~run_stage->proc~ocean_horizontal_viscosity_apply_tendencies proc~ocean_horizontal_viscosity_compute_ke_diss ocean_horizontal_viscosity_compute_ke_diss proc~run_stage->proc~ocean_horizontal_viscosity_compute_ke_diss proc~ocean_horizontal_viscosity_compute_tendencies ocean_horizontal_viscosity_compute_tendencies proc~run_stage->proc~ocean_horizontal_viscosity_compute_tendencies proc~ocean_ideal_age_apply ocean_ideal_age_apply proc~run_stage->proc~ocean_ideal_age_apply proc~ocean_lateral_mix_compute ocean_lateral_mix_compute proc~run_stage->proc~ocean_lateral_mix_compute proc~ocean_pressure_force_apply ocean_pressure_force_apply proc~run_stage->proc~ocean_pressure_force_apply proc~ocean_pressure_force_compute ocean_pressure_force_compute proc~run_stage->proc~ocean_pressure_force_compute proc~ocean_slopes_compute ocean_slopes_compute proc~run_stage->proc~ocean_slopes_compute proc~ocean_surface_flux_apply_tracers ocean_surface_flux_apply_tracers proc~run_stage->proc~ocean_surface_flux_apply_tracers proc~ocean_surface_stress_apply_tendencies ocean_surface_stress_apply_tendencies proc~run_stage->proc~ocean_surface_stress_apply_tendencies proc~ocean_surface_stress_compute_tendencies ocean_surface_stress_compute_tendencies proc~run_stage->proc~ocean_surface_stress_compute_tendencies proc~ocean_top_drag_apply_tendencies ocean_top_drag_apply_tendencies proc~run_stage->proc~ocean_top_drag_apply_tendencies proc~ocean_top_drag_compute_tendencies ocean_top_drag_compute_tendencies proc~run_stage->proc~ocean_top_drag_compute_tendencies proc~tracer_advect_vertical tracer_advect_vertical proc~run_stage->proc~tracer_advect_vertical proc~tracer_hdiff tracer_hdiff proc~run_stage->proc~tracer_hdiff proc~vmix_apply_in_stage vmix_apply_in_stage proc~run_stage->proc~vmix_apply_in_stage proc~bbl_column_conc_impl bbl_column_conc_impl proc~vdiff_set_viscous_bbl->proc~bbl_column_conc_impl proc~bbl_faces_impl bbl_faces_impl proc~vdiff_set_viscous_bbl->proc~bbl_faces_impl proc~ocean_surface_flux_apply_sw_penetration ocean_surface_flux_apply_sw_penetration proc~apply_sw_and_restore->proc~ocean_surface_flux_apply_sw_penetration proc~ocean_surface_restore_apply_tracers ocean_surface_restore_apply_tracers proc~apply_sw_and_restore->proc~ocean_surface_restore_apply_tracers proc~bbl_column_conc_impl->local rdb_vl_column_conc rdb_vl_column_conc proc~bbl_column_conc_impl->rdb_vl_column_conc proc~bbl_faces_impl->local proc~eos_density_derivs eos_density_derivs proc~bbl_faces_impl->proc~eos_density_derivs proc~continuity_tracer_step_split->proc~drain_copy_3d proc~continuity_tracer_step_split->proc~drain_rescale_htr proc~continuity_tracer_step_split->proc~drain_rescale_htr_budget proc~continuity_tracer_step_split->proc~ocean_halo_is_decomposed_x proc~continuity_tracer_step_split->proc~ocean_halo_is_decomposed_y interface~ocean_fold_north_v_face ocean_fold_north_v_face proc~continuity_tracer_step_split->interface~ocean_fold_north_v_face interface~ocean_halo_centre ocean_halo_centre proc~continuity_tracer_step_split->interface~ocean_halo_centre proc~accumulate_flux_x accumulate_flux_x proc~continuity_tracer_step_split->proc~accumulate_flux_x proc~accumulate_flux_y accumulate_flux_y proc~continuity_tracer_step_split->proc~accumulate_flux_y proc~continuity_apply_meridional continuity_apply_meridional proc~continuity_tracer_step_split->proc~continuity_apply_meridional proc~continuity_apply_zonal continuity_apply_zonal proc~continuity_tracer_step_split->proc~continuity_apply_zonal proc~continuity_meridional_flux continuity_meridional_flux proc~continuity_tracer_step_split->proc~continuity_meridional_flux proc~continuity_zonal_flux continuity_zonal_flux proc~continuity_tracer_step_split->proc~continuity_zonal_flux proc~mle_fold_x mle_fold_x proc~continuity_tracer_step_split->proc~mle_fold_x proc~mle_fold_y mle_fold_y proc~continuity_tracer_step_split->proc~mle_fold_y proc~ocean_bc_outer_face_tag ocean_bc_outer_face_tag proc~continuity_tracer_step_split->proc~ocean_bc_outer_face_tag proc~ocean_fold_wrap_centre_3d_state ocean_fold_wrap_centre_3d_state proc~continuity_tracer_step_split->proc~ocean_fold_wrap_centre_3d_state proc~ocean_periodic_wrap_centre_3d ocean_periodic_wrap_centre_3d proc~continuity_tracer_step_split->proc~ocean_periodic_wrap_centre_3d proc~pd_limit_meridional_impl pd_limit_meridional_impl proc~continuity_tracer_step_split->proc~pd_limit_meridional_impl proc~pd_limit_zonal_impl pd_limit_zonal_impl proc~continuity_tracer_step_split->proc~pd_limit_zonal_impl proc~profiler_start profiler_start proc~continuity_tracer_step_split->proc~profiler_start proc~profiler_stop profiler_stop proc~continuity_tracer_step_split->proc~profiler_stop proc~tracer_advect_meridional tracer_advect_meridional proc~continuity_tracer_step_split->proc~tracer_advect_meridional proc~tracer_advect_zonal tracer_advect_zonal proc~continuity_tracer_step_split->proc~tracer_advect_zonal proc~coriolis_adv_compute_tendencies_hk coriolis_adv_compute_tendencies_hk proc~coriolis_adv_compute_tendencies->proc~coriolis_adv_compute_tendencies_hk proc~coriolis_adv_compute_tendencies_sadourny coriolis_adv_compute_tendencies_sadourny proc~coriolis_adv_compute_tendencies->proc~coriolis_adv_compute_tendencies_sadourny proc~coriolis_adv_compute_tendencies_sadourny_energy coriolis_adv_compute_tendencies_sadourny_energy proc~coriolis_adv_compute_tendencies->proc~coriolis_adv_compute_tendencies_sadourny_energy proc~drain_avail_limit->local proc~drain_avail_scale_x->local proc~drain_avail_scale_y->local proc~drain_limit_x->local proc~drain_limit_y->local proc~drain_parabola_x->local proc~ppm_cell_limiter ppm_cell_limiter proc~drain_parabola_x->proc~ppm_cell_limiter proc~ppm_limited_slope ppm_limited_slope proc~drain_parabola_x->proc~ppm_limited_slope proc~ppm_mirror_h ppm_mirror_h proc~drain_parabola_x->proc~ppm_mirror_h proc~drain_parabola_y->local proc~drain_parabola_y->proc~ppm_cell_limiter proc~drain_parabola_y->proc~ppm_limited_slope proc~drain_parabola_y->proc~ppm_mirror_h proc~drain_reconstruct_hprev->local proc~drain_rescale_htr_budget->local proc~drain_swept_flux_x->local proc~drain_swept_flux_x_weno->local proc~weno_face_conc_x weno_face_conc_x proc~drain_swept_flux_x_weno->proc~weno_face_conc_x proc~drain_swept_flux_y->local proc~drain_swept_flux_y_weno->local proc~weno_face_conc_y weno_face_conc_y proc~drain_swept_flux_y_weno->proc~weno_face_conc_y interface~fold_north_centre fold_north_centre proc~drain_wrap_centre->interface~fold_north_centre proc~drain_wrap_centre->proc~ocean_periodic_wrap_centre_3d interface~fold_north_u_face fold_north_u_face proc~drain_wrap_face_x->interface~fold_north_u_face proc~ocean_periodic_wrap_face_x_3d ocean_periodic_wrap_face_x_3d proc~drain_wrap_face_x->proc~ocean_periodic_wrap_face_x_3d interface~fold_north_v_face fold_north_v_face proc~drain_wrap_face_y->interface~fold_north_v_face proc~ocean_periodic_wrap_face_y_3d ocean_periodic_wrap_face_y_3d proc~drain_wrap_face_y->proc~ocean_periodic_wrap_face_y_3d proc~efp_carry efp_carry proc~ocean_accumulate_mass_out->proc~efp_carry proc~efp_decompose_impl efp_decompose_impl proc~ocean_accumulate_mass_out->proc~efp_decompose_impl proc~ocean_bottom_drag_compute_tendencies->local proc~compute_distributed_drag compute_distributed_drag proc~ocean_bottom_drag_compute_tendencies->proc~compute_distributed_drag error error proc~ocean_cavity_mass_step->error proc~cavity_comp_apply_impl cavity_comp_apply_impl proc~ocean_cavity_mass_step->proc~cavity_comp_apply_impl proc~cavity_comp_scale_tracer_impl cavity_comp_scale_tracer_impl proc~ocean_cavity_mass_step->proc~cavity_comp_scale_tracer_impl proc~cavity_comp_withdrawal cavity_comp_withdrawal proc~ocean_cavity_mass_step->proc~cavity_comp_withdrawal proc~cavity_mass_apply_impl cavity_mass_apply_impl proc~ocean_cavity_mass_step->proc~cavity_mass_apply_impl proc~cavity_mass_salt_mirror_impl cavity_mass_salt_mirror_impl proc~ocean_cavity_mass_step->proc~cavity_mass_salt_mirror_impl proc~cavity_mass_thin_is_fatal cavity_mass_thin_is_fatal proc~ocean_cavity_mass_step->proc~cavity_mass_thin_is_fatal proc~cavity_mass_totals_impl cavity_mass_totals_impl proc~ocean_cavity_mass_step->proc~cavity_mass_totals_impl proc~fail fail proc~ocean_cavity_mass_step->proc~fail proc~halo_allreduce_sum halo_allreduce_sum proc~ocean_cavity_mass_step->proc~halo_allreduce_sum to_string to_string proc~ocean_cavity_mass_step->to_string proc~compute_channel_drag_rates compute_channel_drag_rates proc~ocean_channel_drag_compute_tendencies->proc~compute_channel_drag_rates proc~eos_compute_arrays eos_compute_arrays proc~ocean_eos_compute->proc~eos_compute_arrays proc~apply_geothermal_src_impl apply_geothermal_src_impl proc~ocean_geothermal_apply_tracers->proc~apply_geothermal_src_impl proc~hvisc_apply_impl hvisc_apply_impl proc~ocean_horizontal_viscosity_apply_tendencies->proc~hvisc_apply_impl proc~hvisc_ke_diss_impl hvisc_ke_diss_impl proc~ocean_horizontal_viscosity_compute_ke_diss->proc~hvisc_ke_diss_impl proc~ocean_horizontal_viscosity_compute_tendencies_on ocean_horizontal_viscosity_compute_tendencies_on proc~ocean_horizontal_viscosity_compute_tendencies->proc~ocean_horizontal_viscosity_compute_tendencies_on proc~ocean_ideal_age_age_step ocean_ideal_age_age_step proc~ocean_ideal_age_apply->proc~ocean_ideal_age_age_step proc~ocean_lateral_mix_compute_leith ocean_lateral_mix_compute_leith proc~ocean_lateral_mix_compute->proc~ocean_lateral_mix_compute_leith proc~ocean_lateral_mix_compute_leith_biharm ocean_lateral_mix_compute_leith_biharm proc~ocean_lateral_mix_compute->proc~ocean_lateral_mix_compute_leith_biharm proc~ocean_lateral_mix_compute_smag ocean_lateral_mix_compute_smag proc~ocean_lateral_mix_compute->proc~ocean_lateral_mix_compute_smag proc~ocean_lateral_mix_compute_smag_ah ocean_lateral_mix_compute_smag_ah proc~ocean_lateral_mix_compute->proc~ocean_lateral_mix_compute_smag_ah proc~ocean_lateral_mix_compute_vel_scale ocean_lateral_mix_compute_vel_scale proc~ocean_lateral_mix_compute->proc~ocean_lateral_mix_compute_vel_scale proc~ocean_pressure_force_compute->local proc~compute_fv_mom6_impl compute_fv_mom6_impl proc~ocean_pressure_force_compute->proc~compute_fv_mom6_impl proc~compute_fv_mom6_insitu_pcm_impl compute_fv_mom6_insitu_pcm_impl proc~ocean_pressure_force_compute->proc~compute_fv_mom6_insitu_pcm_impl proc~compute_fv_mom6_reconstruct_impl compute_fv_mom6_reconstruct_impl proc~ocean_pressure_force_compute->proc~compute_fv_mom6_reconstruct_impl proc~compute_gprime_impl compute_gprime_impl proc~ocean_pressure_force_compute->proc~compute_gprime_impl proc~eos_wright_pgf_column_sweep_impl eos_wright_pgf_column_sweep_impl proc~ocean_pressure_force_compute->proc~eos_wright_pgf_column_sweep_impl proc~use_insitu_pcm use_insitu_pcm proc~ocean_pressure_force_compute->proc~use_insitu_pcm proc~ocean_slopes_compute_impl ocean_slopes_compute_impl proc~ocean_slopes_compute->proc~ocean_slopes_compute_impl proc~apply_surface_src_2d_dyn_impl apply_surface_src_2d_dyn_impl proc~ocean_surface_flux_apply_tracers->proc~apply_surface_src_2d_dyn_impl proc~apply_surface_src_2d_dyn_nobudget_impl apply_surface_src_2d_dyn_nobudget_impl proc~ocean_surface_flux_apply_tracers->proc~apply_surface_src_2d_dyn_nobudget_impl proc~apply_surface_src_2d_impl apply_surface_src_2d_impl proc~ocean_surface_flux_apply_tracers->proc~apply_surface_src_2d_impl proc~apply_surface_src_2d_nobudget_impl apply_surface_src_2d_nobudget_impl proc~ocean_surface_flux_apply_tracers->proc~apply_surface_src_2d_nobudget_impl proc~surfstress_apply_impl surfstress_apply_impl proc~ocean_surface_stress_apply_tendencies->proc~surfstress_apply_impl proc~surfstress_compute_impl surfstress_compute_impl proc~ocean_surface_stress_compute_tendencies->proc~surfstress_compute_impl proc~surfstress_distributed_impl surfstress_distributed_impl proc~ocean_surface_stress_compute_tendencies->proc~surfstress_distributed_impl proc~top_drag_stress_mag_impl top_drag_stress_mag_impl proc~ocean_top_drag_compute_tendencies->proc~top_drag_stress_mag_impl proc~top_drag_tendencies_impl top_drag_tendencies_impl proc~ocean_top_drag_compute_tendencies->proc~top_drag_tendencies_impl proc~apply_w_to_h_layer apply_w_to_h_layer proc~tracer_advect_vertical->proc~apply_w_to_h_layer proc~tracer_advect_vertical_one_impl tracer_advect_vertical_one_impl proc~tracer_advect_vertical->proc~tracer_advect_vertical_one_impl proc~tracer_hdiff->proc~ocean_bc_outer_face_tag proc~tracer_hdiff_one_impl tracer_hdiff_one_impl proc~tracer_hdiff->proc~tracer_hdiff_one_impl proc~vmix_apply_in_stage->proc~ocean_dyn_is_thermo_step proc~vmix_apply_in_stage->proc~ocean_dyn_therm_dt proc~vmix_apply_in_stage->error proc~epbl_compute epbl_compute proc~vmix_apply_in_stage->proc~epbl_compute proc~epbl_merge_into_kv_kt epbl_merge_into_kv_kt proc~vmix_apply_in_stage->proc~epbl_merge_into_kv_kt proc~kappa_shear_compute kappa_shear_compute proc~vmix_apply_in_stage->proc~kappa_shear_compute proc~kappa_shear_merge_into_kv_kt kappa_shear_merge_into_kv_kt proc~vmix_apply_in_stage->proc~kappa_shear_merge_into_kv_kt proc~vmix_apply_in_stage->proc~profiler_start proc~vmix_apply_in_stage->proc~profiler_stop proc~tidal_mixing_compute tidal_mixing_compute proc~vmix_apply_in_stage->proc~tidal_mixing_compute proc~tidal_mixing_merge_into_kt tidal_mixing_merge_into_kt proc~vmix_apply_in_stage->proc~tidal_mixing_merge_into_kt proc~vdiff_apply_momentum vdiff_apply_momentum proc~vmix_apply_in_stage->proc~vdiff_apply_momentum proc~vdiff_apply_tracers vdiff_apply_tracers proc~vmix_apply_in_stage->proc~vdiff_apply_tracers proc~visc_rem_halo_refresh visc_rem_halo_refresh proc~vmix_apply_in_stage->proc~visc_rem_halo_refresh proc~visc_rem_precompute visc_rem_precompute proc~vmix_apply_in_stage->proc~visc_rem_precompute proc~vmix_add_kv_ml_invz2 vmix_add_kv_ml_invz2 proc~vmix_apply_in_stage->proc~vmix_add_kv_ml_invz2 proc~vmix_apply_convection vmix_apply_convection proc~vmix_apply_in_stage->proc~vmix_apply_convection proc~vmix_apply_kpp_overlay vmix_apply_kpp_overlay proc~vmix_apply_in_stage->proc~vmix_apply_kpp_overlay proc~vmix_apply_nonlocal_tendencies vmix_apply_nonlocal_tendencies proc~vmix_apply_in_stage->proc~vmix_apply_nonlocal_tendencies proc~vmix_assemble vmix_assemble proc~vmix_apply_in_stage->proc~vmix_assemble proc~vmix_compute_pp81 vmix_compute_pp81 proc~vmix_apply_in_stage->proc~vmix_compute_pp81 proc~vmix_split_kd_heat_salt vmix_split_kd_heat_salt proc~vmix_apply_in_stage->proc~vmix_split_kd_heat_salt

Called by

proc~~ocean_dyn_step~~CalledByGraph proc~ocean_dyn_step ocean_dyn_step proc~engine_step engine_step proc~engine_step->proc~ocean_dyn_step proc~driver_run_ocean driver_run_ocean proc~driver_run_ocean->proc~engine_step proc~rdb_ocean_step rdb_ocean_step proc~rdb_ocean_step->proc~engine_step proc~driver_run driver_run proc~driver_run->proc~driver_run_ocean

Variables

Type Visibility Attributes Name Initial
integer, private :: it
real(kind=wp), private :: t_now

Source Code

   subroutine ocean_dyn_step(grid, metrics, dyn, eos, cor, ct, pgf, hv, bd, ss, va, hd, vd, vmix, ms, dt, sf, geo, lateral_mix, epbl, kshear, slopes, vmix_tidal, bc, t, td, cav)
      !! Multilayer extension of `ocean_dyn_step_barotropic`.  One
      !! SSP-RK2 outer step that orchestrates the full per-layer
      !! dynamical core:
      !!
      !!   EOS  → continuity-PPM  → Sadourny Coriolis-adv
      !!        → Mont pressure-force  → Laplacian hvisc
      !!        → bottom drag  → surface stress
      !!        → horizontal tracer advection
      !!        → diagnose w  → vertical tracer advection (Eulerian z)
      !!        → applies
      !!
      !! Each stage runs every compute kernel in sequence, then the
      !! apply step.  The two SSP-RK2 stages save the prognostic
      !! state into the *_0 buffers (h_layer0, u_face_x_layer0,
      !! v_face_y_layer0, plus hTr0 on every registered tracer),
      !! run two full FE substeps, and average with the saved
      !! state to recover the second-order-accurate result.
      !!
      !! The Coriolis parameter lives on the `coriolis_adv_t` slot
      !! as `f_corner(:, :)` (C-grid corners).  Defaults to a uniform
      !! `f_0` at init; call `cor%set_beta_plane(grid, f_0, beta, y_ref)`
      !! for the beta-plane variant `f(y) = f_0 + beta*(y - y_ref)`.
      !!
      !! Caller passes the individual slots rather than the full
      !! `ocean_state_t` to avoid a circular module dependency
      !! (rdb_ocean_state already `use`s rdb_ocean_dyn).
      type(hgrid_t), intent(in) :: grid
      type(ocean_metrics_t), intent(in) :: metrics
         !! Curvilinear horizontal metrics — forwarded to the PGF (and,
         !! in slice 2, the other geometry-aware kernels).
      type(ocean_dyn_t), intent(inout) :: dyn
      type(eos_t), intent(in) :: eos
      type(coriolis_adv_t), intent(inout) :: cor
      type(continuity_t), intent(inout) :: ct
      type(ocean_pressure_force_t), intent(inout) :: pgf
      type(ocean_horizontal_viscosity_t), intent(inout) :: hv
      type(ocean_bottom_drag_t), intent(inout) :: bd
      type(ocean_top_drag_t), intent(inout), optional :: td
         !! Ice-shelf TOP-drag slot (`&ocean_tdrag_nml`).  OPTIONAL so the
         !! many direct `ocean_dyn_step*` / `run_stage*` call sites in the
         !! test suite need no churn; the production driver always passes
         !! it.  Absent, or present and disabled, => no kernel launch and
         !! a bit-identical step.
      type(ocean_cavity_flux_t), intent(inout), optional :: cav
         !! Ice-shelf basal-melt slot (`&ocean_cavity_melt_nml`).
         !! OPTIONAL for the same reason `td` is: the direct
         !! `ocean_dyn_step*` / `run_stage*` call sites in the test suite
         !! need no churn, and the production driver always passes it.
         !! Absent, disabled, or `freshwater="virtual"` => no kernel
         !! launch and a bit-identical step.  It is threaded down here
         !! rather than acted on in `engine_step_finalize` because the
         !! real-freshwater volume must be spent in the SAME stage, at
         !! the SAME stage weight and from the SAME `melt` value as the
         !! salt and heat halves the surface-flux apply spends -- see
         !! `ocean_cavity_mass_step`'s docstring.
      type(ocean_surface_stress_t), intent(inout) :: ss
      type(ocean_vertical_advection_t), intent(inout) :: va
      type(ocean_hdiff_tracer_t), intent(inout) :: hd
      type(ocean_vdiff_t), intent(inout) :: vd
      type(ocean_vmix_t), intent(inout) :: vmix
      type(multilayer_state_t), intent(inout) :: ms
      real(wp), intent(in) :: dt
      type(ocean_surface_flux_t), intent(in), optional :: sf
      type(ocean_geothermal_t), intent(in), optional :: geo
         !! Geothermal bottom-heat-flux slot.  Absent or `enable=.false.`
         !! preserves the historical no-geothermal path bit-identically.
      type(ocean_lateral_mix_t), intent(inout), optional :: lateral_mix
      type(ocean_epbl_t), intent(inout), optional :: epbl
         !! Energetics-based PBL slot.  Absent or `enable=.false.`
         !! preserves the historical PP81/KPP path bit-identically.
      type(ocean_kappa_shear_t), intent(inout), optional :: kshear
         !! Kappa-shear interior closure slot.  Absent or
         !! `enable=.false.` preserves the historical path bit-identically.
      type(ocean_slopes_t), intent(inout), optional :: slopes
         !! Isopycnal-slope diagnostic slot.  Absent or `enable=.false.`
         !! preserves the historical path bit-identically (diagnostic
         !! only — never feeds back into prognostics).
      type(ocean_tidal_mixing_t), intent(inout), optional :: vmix_tidal
         !! Tidal-mixing interior closure slot.  Absent or
         !! `enable=.false.` preserves the historical path bit-identically.
      type(ocean_bc_state_t), intent(in), optional :: bc
         !! Boundary state — forwarded ONLY to the windowed tracer-advect
         !! drain so its single-rank periodic-x / north-fold seam wraps
         !! fire for periodic unsplit runs at `dt_tracer_advect_ratio > 1`.
         !! Absent ⇒ wall seams (the historical unsplit default); ratio = 1
         !! never drains so this is inert there (bit-identical).
      real(wp), intent(in), optional :: t
         !! Model time (s) since run start, used to evaluate the ideal-age
         !! vintage-mode surface value (PR-7).  Mirrors the split driver's
         !! `t` dummy (`ocean_dyn_step_split`).  Absent ⇒ `t = 0`.

      integer :: it
      real(wp) :: t_now

      ! ---- Save u^n into the *_0 buffers ----
      call save_state(ms)
      if (allocated(ms%tracers)) then
         do it = 1, size(ms%tracers)
            call copy_field_3d(ms%tracers(it)%hTr, ms%tracers(it)%hTr0, &
                               size(ms%tracers(it)%hTr, 1), &
                               size(ms%tracers(it)%hTr, 2), &
                               size(ms%tracers(it)%hTr, 3))
         end do
      end if

      ! MOM6 `set_viscous_BBL`: the per-face bottom boundary layer the
      ! vdiff glue reads, once per outer step from the start-of-step
      ! state.  No-op unless the per-face BBL glue is configured.
      call vdiff_set_viscous_bbl(grid, vd, ms, eos, cor%f_corner)

      ! ---- Stage 1: tendencies at u^n, FE step -> u^(1) ----
      call run_stage(grid, metrics, dyn, eos, cor, ct, pgf, hv, bd, ss, va, hd, &
                     vd, vmix, ms, dt, 1, sf=sf, geo=geo, lateral_mix=lateral_mix, &
                     epbl=epbl, kshear=kshear, slopes=slopes, vmix_tidal=vmix_tidal, td=td, &
                     cav=cav)

      ! ---- Stage 2: tendencies at u^(1), FE step -> u^(1) + dt*L(u^(1)) ----
      call run_stage(grid, metrics, dyn, eos, cor, ct, pgf, hv, bd, ss, va, hd, &
                     vd, vmix, ms, dt, 2, sf=sf, geo=geo, lateral_mix=lateral_mix, &
                     epbl=epbl, kshear=kshear, slopes=slopes, vmix_tidal=vmix_tidal, td=td, &
                     cav=cav)

      ! ---- RK2 average: u^(n+1) = 0.5 * (u^n + stage2 result) ----
      call rk2_average(ms)
      if (dyn%check_h_positive) then
         call check_h_positive_or_die(grid, ms, "after rk2_average", 3, &
                                      dyn%outer_step_count + 1, check_layers=.true.)
      end if
      ! Land-face velocity reset on the averaged state (C4 / R4b.2).
      call mask_layer_velocities(grid, metrics, ms, bt_work=dyn%bt_work)
      if (allocated(ms%tracers)) then
         do it = 1, size(ms%tracers)
            call rk2_average_field_3d(ms%tracers(it)%hTr0, ms%tracers(it)%hTr, &
                                      size(ms%tracers(it)%hTr, 1), &
                                      size(ms%tracers(it)%hTr, 2), &
                                      size(ms%tracers(it)%hTr, 3))
         end do
      end if

      ! Velocity housekeeping (E7): advective-CFL truncation then the
      ! absolute maxvel cap.  Both no-op when their knob <= 0.
      call apply_velocity_truncation(ms, metrics, dt, dyn%cfl_trunc, dyn%maxvel, dyn%ntrunc_step)
      dyn%ntrunc_total = dyn%ntrunc_total + dyn%ntrunc_step

      ! Phase 2 (6b) windowed tracer-advect drain (unsplit reference path).
      ! No-op at ratio = 1 (never accumulated).  No vcoord here (the unsplit
      ! path does not remap), so the drain fires on the window-full predicate
      ! only.  `bc` IS forwarded (when present) so periodic-x / north-fold
      ! seam wraps fire for periodic unsplit runs — matching the split path.
      if (dyn%dt_tracer_advect_ratio > 1) then
         ct%t_dyn_rel_adv = ct%t_dyn_rel_adv + dt
         if (dyn%is_tracer_advect_step()) then
            if (present(bc)) then
               call continuity_tracer_drain(grid, metrics, ct, ms, dyn%dt_tracer_advect_ratio, bc=bc)
            else
               call continuity_tracer_drain(grid, metrics, ct, ms, dyn%dt_tracer_advect_ratio)
            end if
         end if
      end if

      ! Ideal-age surface reset (PR-7): once per outer step, after
      ! rk2_average and the windowed-drain block above (last operator to
      ! touch k=nz — there is no ALE remap on the unsplit path, so
      ! post-average + post-drain is already last).  See the ordering
      ! comment in `ocean_dyn_step_split` for the full rationale.
      if (dyn%is_thermo_step()) then
         t_now = 0.0_wp
         if (present(t)) t_now = t
         call ocean_ideal_age_reset_surface(grid, ms, &
                                            ocean_ideal_age_young_val(dyn%ideal_age_young_val, &
                                                                      dyn%ideal_age_sfc_growth_rate, t_now))
      end if

      dyn%outer_step_count = dyn%outer_step_count + 1
   end subroutine ocean_dyn_step