ppm_cell_limiter Subroutine

public pure subroutine ppm_cell_limiter(h_centre, h_left, h_right)

Colella-Woodward 1984 eq 1.10 monotonic limiter on the parabolic profile in a single cell. Three branches:

  1. Local extremum in cell (h_centre lies outside [min(h_left,h_right), max(h_left,h_right)]): flatten the parabola — h_left = h_right = h_centre.
  2. “Overshoot” at the left edge — reset h_left so the parabola’s minimum/maximum lies at the right edge.
  3. “Overshoot” at the right edge — symmetric.

Consumer: rdb_ice_transport (sea-ice PR 4b) — SIS2’s PPM_limit_CW84.

Arguments

Type IntentOptional Attributes Name
real(kind=wp), intent(in) :: h_centre
real(kind=wp), intent(inout) :: h_left
real(kind=wp), intent(inout) :: h_right

Called by

proc~~ppm_cell_limiter~~CalledByGraph proc~ppm_cell_limiter ppm_cell_limiter proc~continuity_compute_fluxes continuity_compute_fluxes proc~continuity_compute_fluxes->proc~ppm_cell_limiter proc~continuity_compute_fluxes_barotropic continuity_compute_fluxes_barotropic proc~continuity_compute_fluxes_barotropic->proc~ppm_cell_limiter proc~continuity_meridional_flux continuity_meridional_flux proc~continuity_meridional_flux->proc~ppm_cell_limiter proc~continuity_zonal_flux continuity_zonal_flux proc~continuity_zonal_flux->proc~ppm_cell_limiter proc~drain_parabola_x drain_parabola_x proc~drain_parabola_x->proc~ppm_cell_limiter proc~drain_parabola_y drain_parabola_y proc~drain_parabola_y->proc~ppm_cell_limiter proc~ice_cat_flux_x_impl ice_cat_flux_x_impl proc~ice_cat_flux_x_impl->proc~ppm_cell_limiter proc~ice_cat_flux_y_impl ice_cat_flux_y_impl proc~ice_cat_flux_y_impl->proc~ppm_cell_limiter proc~tracer_advect_meridional_one_impl tracer_advect_meridional_one_impl proc~tracer_advect_meridional_one_impl->proc~ppm_cell_limiter proc~tracer_advect_one_impl tracer_advect_one_impl proc~tracer_advect_one_impl->proc~ppm_cell_limiter proc~tracer_advect_zonal_one_impl tracer_advect_zonal_one_impl proc~tracer_advect_zonal_one_impl->proc~ppm_cell_limiter proc~continuity_step_split continuity_step_split proc~continuity_step_split->proc~continuity_meridional_flux proc~continuity_step_split->proc~continuity_zonal_flux proc~continuity_tracer_drain continuity_tracer_drain proc~continuity_tracer_drain->proc~drain_parabola_x proc~continuity_tracer_drain->proc~drain_parabola_y proc~continuity_tracer_step_split continuity_tracer_step_split proc~continuity_tracer_step_split->proc~continuity_meridional_flux proc~continuity_tracer_step_split->proc~continuity_zonal_flux 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~gm_tracer_advect_x gm_tracer_advect_x proc~gm_tracer_advect_x->proc~tracer_advect_zonal_one_impl proc~gm_tracer_advect_y gm_tracer_advect_y proc~gm_tracer_advect_y->proc~tracer_advect_meridional_one_impl proc~ice_pass_x ice_pass_x proc~ice_pass_x->proc~ice_cat_flux_x_impl proc~ice_pass_y ice_pass_y proc~ice_pass_y->proc~ice_cat_flux_y_impl proc~ocean_dyn_step_barotropic ocean_dyn_step_barotropic proc~ocean_dyn_step_barotropic->proc~continuity_compute_fluxes_barotropic proc~tracer_advect tracer_advect proc~tracer_advect->proc~tracer_advect_one_impl proc~tracer_advect_meridional->proc~tracer_advect_meridional_one_impl proc~tracer_advect_zonal->proc~tracer_advect_zonal_one_impl proc~continuity_gm_apply continuity_gm_apply proc~continuity_gm_apply->proc~gm_tracer_advect_x proc~continuity_gm_apply->proc~gm_tracer_advect_y proc~ice_transport_step ice_transport_step proc~ice_transport_step->proc~ice_pass_x proc~ice_transport_step->proc~ice_pass_y proc~ocean_dyn_flush_tracer_window ocean_dyn_flush_tracer_window proc~ocean_dyn_flush_tracer_window->proc~continuity_tracer_drain proc~ocean_dyn_step ocean_dyn_step proc~ocean_dyn_step->proc~continuity_tracer_drain proc~run_stage run_stage proc~ocean_dyn_step->proc~run_stage proc~ocean_dyn_step_split ocean_dyn_step_split proc~ocean_dyn_step_split->proc~continuity_tracer_drain proc~run_gm_step run_gm_step proc~ocean_dyn_step_split->proc~run_gm_step proc~run_stage_split run_stage_split proc~ocean_dyn_step_split->proc~run_stage_split proc~run_continuity_chain run_continuity_chain proc~run_continuity_chain->proc~continuity_tracer_step_split proc~run_stage->proc~continuity_tracer_step_split proc~driver_run_ocean driver_run_ocean proc~driver_run_ocean->proc~ocean_dyn_flush_tracer_window proc~engine_step engine_step proc~driver_run_ocean->proc~engine_step proc~engine_step_ice engine_step_ice proc~driver_run_ocean->proc~engine_step_ice proc~engine_step->proc~ocean_dyn_step proc~engine_step->proc~ocean_dyn_step_split proc~engine_step_ice->proc~ice_transport_step proc~rdb_ocean_set_tracer rdb_ocean_set_tracer proc~rdb_ocean_set_tracer->proc~ocean_dyn_flush_tracer_window proc~run_gm_step->proc~continuity_gm_apply proc~run_stage_split->proc~run_continuity_chain proc~driver_run driver_run proc~driver_run->proc~driver_run_ocean proc~rdb_ocean_step rdb_ocean_step proc~rdb_ocean_step->proc~engine_step proc~rdb_ocean_step->proc~engine_step_ice

Variables

Type Visibility Attributes Name Initial
real(kind=wp), private :: dh_lr
real(kind=wp), private :: h_six

Source Code

   pure subroutine ppm_cell_limiter(h_centre, h_left, h_right)
      !$acc routine seq
      !! Colella-Woodward 1984 eq 1.10 monotonic limiter on the
      !! parabolic profile in a single cell.  Three branches:
      !!
      !!   1. Local extremum in cell (h_centre lies outside
      !!      [min(h_left,h_right), max(h_left,h_right)]): flatten
      !!      the parabola — h_left = h_right = h_centre.
      !!   2. "Overshoot" at the left edge — reset h_left so the
      !!      parabola's minimum/maximum lies at the right edge.
      !!   3. "Overshoot" at the right edge — symmetric.
      !!
      !! Consumer: `rdb_ice_transport` (sea-ice PR 4b) — SIS2's
      !! `PPM_limit_CW84`.
      real(wp), intent(in) :: h_centre
      real(wp), intent(inout) :: h_left, h_right
      real(wp) :: dh_lr, h_six

      dh_lr = h_right - h_left
      h_six = 6.0_wp*(h_centre - 0.5_wp*(h_left + h_right))
      if ((h_right - h_centre)*(h_centre - h_left) <= 0.0_wp) then
         h_left = h_centre
         h_right = h_centre
      else if (dh_lr*h_six > dh_lr*dh_lr) then
         h_left = 3.0_wp*h_centre - 2.0_wp*h_right
      else if (dh_lr*h_six < -dh_lr*dh_lr) then
         h_right = 3.0_wp*h_centre - 2.0_wp*h_left
      end if
   end subroutine ppm_cell_limiter