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
| Type | Intent | Optional | 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. |
| 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 |
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