weno5_face_swept Function

public pure function weno5_face_swept(qm2, qm1, q0, qp1, qp2, sigma) result(face)

WENO5-Z swept-average face value (u > 0, upwind cell = q0).

Three quadratic candidates reconstructing the right edge of cell q0. Smoothness indicators: Jiang & Shu (1996), eq. 3.1. Z-weights: Borges et al. (2008).

Stencil offsets relative to upwind cell i=q0: r=0: {i-2, i-1, i} d=1/10 r=1: {i-1, i, i+1} d=6/10 r=2: {i, i+1, i+2} d=3/10

Arguments

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

Cell averages at i-2, i-1, i, i+1, i+2.

real(kind=wp), intent(in) :: qm1

Cell averages at i-2, i-1, i, i+1, i+2.

real(kind=wp), intent(in) :: q0

Cell averages at i-2, i-1, i, i+1, i+2.

real(kind=wp), intent(in) :: qp1

Cell averages at i-2, i-1, i, i+1, i+2.

real(kind=wp), intent(in) :: qp2

Cell averages at i-2, i-1, i, i+1, i+2.

real(kind=wp), intent(in) :: sigma

CFL of upwind cell: |u_eff|*dt/dx.

Return Value real(kind=wp)


Called by

proc~~weno5_face_swept~~CalledByGraph proc~weno5_face_swept weno5_face_swept proc~weno_face_conc_x weno_face_conc_x proc~weno_face_conc_x->proc~weno5_face_swept proc~weno_face_conc_y weno_face_conc_y proc~weno_face_conc_y->proc~weno5_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 :: A0
real(kind=wp), private :: A1
real(kind=wp), private :: A2
real(kind=wp), private :: B0
real(kind=wp), private :: B1
real(kind=wp), private :: B2
real(kind=wp), private :: C0
real(kind=wp), private :: C1
real(kind=wp), private :: C2
real(kind=wp), private :: alpha0
real(kind=wp), private :: alpha1
real(kind=wp), private :: alpha2
real(kind=wp), private :: alpha_sum
real(kind=wp), private :: beta0
real(kind=wp), private :: beta1
real(kind=wp), private :: beta2
real(kind=wp), private, parameter :: c13_12 = 13.0_wp/12.0_wp
real(kind=wp), private, parameter :: c1_4 = 0.25_wp
real(kind=wp), private, parameter :: d0 = 0.1_wp
real(kind=wp), private, parameter :: d1 = 0.6_wp
real(kind=wp), private, parameter :: d2 = 0.3_wp
real(kind=wp), private, parameter :: eps = 1.0e-36_wp
real(kind=wp), private :: face0
real(kind=wp), private :: face1
real(kind=wp), private :: face2
real(kind=wp), private :: omega0
real(kind=wp), private :: omega1
real(kind=wp), private :: omega2
real(kind=wp), private :: tau5

Source Code

   pure function weno5_face_swept(qm2, qm1, q0, qp1, qp2, sigma) result(face)
      !! WENO5-Z swept-average face value (u > 0, upwind cell = q0).
      !!
      !! Three quadratic candidates reconstructing the right edge of cell q0.
      !! Smoothness indicators: Jiang & Shu (1996), eq. 3.1.
      !! Z-weights: Borges et al. (2008).
      !!
      !! Stencil offsets relative to upwind cell i=q0:
      !!   r=0: {i-2, i-1, i}     d=1/10
      !!   r=1: {i-1, i,   i+1}   d=6/10
      !!   r=2: {i,   i+1, i+2}   d=3/10
      !$acc routine seq
      real(wp), intent(in) :: qm2, qm1, q0, qp1, qp2
         !! Cell averages at i-2, i-1, i, i+1, i+2.
      real(wp), intent(in) :: sigma
         !! CFL of upwind cell: |u_eff|*dt/dx.
      real(wp) :: face

      real(wp), parameter :: d0 = 0.1_wp, d1 = 0.6_wp, d2 = 0.3_wp
      real(wp), parameter :: eps = 1.0e-36_wp
      real(wp), parameter :: c13_12 = 13.0_wp/12.0_wp
      real(wp), parameter :: c1_4 = 0.25_wp

      ! Curvature/slope/intercept for each candidate (quadratic: A + B*xi + C*xi^2)
      ! Cell-centre xi=0, right edge xi=1/2.
      real(wp) :: C0, B0, A0
      real(wp) :: C1, B1, A1
      real(wp) :: C2, B2, A2

      ! Smoothness indicators
      real(wp) :: beta0, beta1, beta2, tau5

      ! Z-weights
      real(wp) :: alpha0, alpha1, alpha2, alpha_sum
      real(wp) :: omega0, omega1, omega2

      ! Swept-average face values per candidate
      real(wp) :: face0, face1, face2

      ! Candidate r=0: stencil {i-2, i-1, i}, offsets (-2,-1,0)
      C0 = 0.5_wp*(qm2 - 2.0_wp*qm1 + q0)
      B0 = C0 - (qm1 - q0)
      A0 = q0 - C0/12.0_wp

      ! Candidate r=1: stencil {i-1, i, i+1}, offsets (-1,0,+1)
      C1 = 0.5_wp*(qm1 - 2.0_wp*q0 + qp1)
      B1 = 0.5_wp*(qp1 - qm1)
      A1 = q0 - C1/12.0_wp

      ! Candidate r=2: stencil {i, i+1, i+2}, offsets (0,+1,+2)
      C2 = 0.5_wp*(q0 - 2.0_wp*qp1 + qp2)
      B2 = qp1 - q0 - C2
      A2 = q0 - C2/12.0_wp

      ! JS96 smoothness indicators
      beta0 = c13_12*(qm2 - 2.0_wp*qm1 + q0)**2 + c1_4*(qm2 - 4.0_wp*qm1 + 3.0_wp*q0)**2
      beta1 = c13_12*(qm1 - 2.0_wp*q0 + qp1)**2 + c1_4*(qm1 - qp1)**2
      beta2 = c13_12*(q0 - 2.0_wp*qp1 + qp2)**2 + c1_4*(3.0_wp*q0 - 4.0_wp*qp1 + qp2)**2

      ! Z-weights (Borges 2008): tau5 = |beta0 - beta2|
      tau5 = abs(beta0 - beta2)
      alpha0 = d0*(1.0_wp + (tau5/(eps + beta0))**2)
      alpha1 = d1*(1.0_wp + (tau5/(eps + beta1))**2)
      alpha2 = d2*(1.0_wp + (tau5/(eps + beta2))**2)
      alpha_sum = alpha0 + alpha1 + alpha2
      omega0 = alpha0/alpha_sum
      omega1 = alpha1/alpha_sum
      omega2 = alpha2/alpha_sum

      ! Swept-average of quadratic A + B*xi + C*xi^2 over [1/2-sigma, 1/2]:
      !   = (A + B/2 + C/4) - sigma/2*(B + C) + sigma^2/6*(2*C)
      face0 = (A0 + 0.5_wp*B0 + 0.25_wp*C0) - 0.5_wp*sigma*(B0 + C0) &
              + sigma**2/3.0_wp*C0
      face1 = (A1 + 0.5_wp*B1 + 0.25_wp*C1) - 0.5_wp*sigma*(B1 + C1) &
              + sigma**2/3.0_wp*C1
      face2 = (A2 + 0.5_wp*B2 + 0.25_wp*C2) - 0.5_wp*sigma*(B2 + C2) &
              + sigma**2/3.0_wp*C2

      face = omega0*face0 + omega1*face1 + omega2*face2
   end function weno5_face_swept