ppm_limited_slope Subroutine

public pure subroutine ppm_limited_slope(h_im1, h_i, h_ip1, dh)

Van Leer monotonized centred slope for cell i. Returns 0 at local extrema (sign change between left and right differences) and the slope-limited centred derivative otherwise. Standard PPM convention; see Colella-Woodward 1984.

Consumer: rdb_ice_transport (sea-ice PR 4b), same role as here (SIS2 Lin-94 slope + limit, SIS_continuity.F90:1464-1468).

Arguments

Type IntentOptional Attributes Name
real(kind=wp), intent(in) :: h_im1
real(kind=wp), intent(in) :: h_i
real(kind=wp), intent(in) :: h_ip1
real(kind=wp), intent(out) :: dh

Called by

proc~~ppm_limited_slope~~CalledByGraph proc~ppm_limited_slope ppm_limited_slope proc~continuity_compute_fluxes continuity_compute_fluxes proc~continuity_compute_fluxes->proc~ppm_limited_slope proc~continuity_compute_fluxes_barotropic continuity_compute_fluxes_barotropic proc~continuity_compute_fluxes_barotropic->proc~ppm_limited_slope proc~continuity_meridional_flux continuity_meridional_flux proc~continuity_meridional_flux->proc~ppm_limited_slope proc~continuity_zonal_flux continuity_zonal_flux proc~continuity_zonal_flux->proc~ppm_limited_slope proc~drain_parabola_x drain_parabola_x proc~drain_parabola_x->proc~ppm_limited_slope proc~drain_parabola_y drain_parabola_y proc~drain_parabola_y->proc~ppm_limited_slope proc~ice_cat_flux_x_impl ice_cat_flux_x_impl proc~ice_cat_flux_x_impl->proc~ppm_limited_slope proc~ice_cat_flux_y_impl ice_cat_flux_y_impl proc~ice_cat_flux_y_impl->proc~ppm_limited_slope proc~tracer_advect_meridional_one_impl tracer_advect_meridional_one_impl proc~tracer_advect_meridional_one_impl->proc~ppm_limited_slope proc~tracer_advect_one_impl tracer_advect_one_impl proc~tracer_advect_one_impl->proc~ppm_limited_slope proc~tracer_advect_zonal_one_impl tracer_advect_zonal_one_impl proc~tracer_advect_zonal_one_impl->proc~ppm_limited_slope 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_centered
real(kind=wp), private :: dh_left
real(kind=wp), private :: dh_right

Source Code

   pure subroutine ppm_limited_slope(h_im1, h_i, h_ip1, dh)
      !$acc routine seq
      !! Van Leer monotonized centred slope for cell i.  Returns 0
      !! at local extrema (sign change between left and right
      !! differences) and the slope-limited centred derivative
      !! otherwise.  Standard PPM convention; see Colella-Woodward
      !! 1984.
      !!
      !! Consumer: `rdb_ice_transport` (sea-ice PR 4b), same role as here
      !! (SIS2 Lin-94 slope + limit, `SIS_continuity.F90:1464-1468`).
      real(wp), intent(in) :: h_im1, h_i, h_ip1
      real(wp), intent(out) :: dh
      real(wp) :: dh_centered, dh_left, dh_right

      dh_left = h_i - h_im1
      dh_right = h_ip1 - h_i
      dh_centered = 0.5_wp*(dh_left + dh_right)
      if (dh_left*dh_right > 0.0_wp) then
         dh = sign(min(abs(dh_centered), &
                       2.0_wp*abs(dh_left), &
                       2.0_wp*abs(dh_right)), &
                   dh_centered)
      else
         dh = 0.0_wp
      end if
   end subroutine ppm_limited_slope