plm_face_swept Function

public pure function plm_face_swept(qm1, q0, qp1, sigma) result(face)

PLM (piecewise-linear) swept-average face value.

For u > 0 the upwind cell is q0; stencil: qm1 = i-1, q0 = i, qp1 = i+1. slope = minmod(q0 - qm1, qp1 - q0) face = q0 + (1 - sigma)/2 * slope

Reference: van Leer (1977) slope limiter.

Arguments

Type IntentOptional Attributes Name
real(kind=wp), intent(in) :: qm1
real(kind=wp), intent(in) :: q0
real(kind=wp), intent(in) :: qp1
real(kind=wp), intent(in) :: sigma

Return Value real(kind=wp)


Called by

proc~~plm_face_swept~~CalledByGraph proc~plm_face_swept plm_face_swept proc~weno_face_conc_x weno_face_conc_x proc~weno_face_conc_x->proc~plm_face_swept proc~weno_face_conc_y weno_face_conc_y proc~weno_face_conc_y->proc~plm_face_swept proc~drain_swept_flux_x_weno drain_swept_flux_x_weno proc~drain_swept_flux_x_weno->proc~weno_face_conc_x proc~drain_swept_flux_y_weno drain_swept_flux_y_weno proc~drain_swept_flux_y_weno->proc~weno_face_conc_y proc~continuity_tracer_drain continuity_tracer_drain proc~continuity_tracer_drain->proc~drain_swept_flux_x_weno proc~continuity_tracer_drain->proc~drain_swept_flux_y_weno 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~ocean_dyn_step_split ocean_dyn_step_split proc~ocean_dyn_step_split->proc~continuity_tracer_drain proc~driver_run_ocean driver_run_ocean proc~driver_run_ocean->proc~ocean_dyn_flush_tracer_window proc~engine_step engine_step proc~engine_step->proc~ocean_dyn_step proc~engine_step->proc~ocean_dyn_step_split proc~rdb_ocean_set_tracer rdb_ocean_set_tracer proc~rdb_ocean_set_tracer->proc~ocean_dyn_flush_tracer_window

Variables

Type Visibility Attributes Name Initial
real(kind=wp), private :: d0
real(kind=wp), private :: d1
real(kind=wp), private :: slope

Source Code

   pure function plm_face_swept(qm1, q0, qp1, sigma) result(face)
      !! PLM (piecewise-linear) swept-average face value.
      !!
      !! For u > 0 the upwind cell is q0; stencil: qm1 = i-1, q0 = i, qp1 = i+1.
      !! slope = minmod(q0 - qm1, qp1 - q0)
      !! face  = q0 + (1 - sigma)/2 * slope
      !!
      !! Reference: van Leer (1977) slope limiter.
      !$acc routine seq
      real(wp), intent(in) :: qm1, q0, qp1, sigma
      real(wp) :: face
      real(wp) :: d0, d1, slope
      d0 = q0 - qm1
      d1 = qp1 - q0
      if (d0*d1 > 0.0_wp) then
         if (abs(d0) < abs(d1)) then
            slope = d0
         else
            slope = d1
         end if
      else
         slope = 0.0_wp
      end if
      face = q0 + 0.5_wp*(1.0_wp - sigma)*slope
   end function plm_face_swept