pure function weno5_recon(q1, q2, q3, q4, q5, q6, adv_vel) result(qf)
!! 5th-order WENO-Z reconstruction (MOM6 `weno_five_h_weight_reconstruction`)
!! of a 6-point corner stencil onto the face between the two central points
!! `q3,q4`, upwind-biased on `adv_vel`. Three 3-point candidates blended by
!! WENO-Z (ideal weights 3/10, 3/5, 1/10; tau = |b0-b2|). Applied to the
!! absolute vorticity directly (see `weno3_recon`). Radius 3 (nghost>=3).
!$acc routine seq
real(wp), intent(in) :: q1, q2, q3, q4, q5, q6
real(wp), intent(in) :: adv_vel
real(wp) :: qf
real(wp) :: c0, c1, c2, b0, b1, b2, tau, w0, w1, w2, sinv
if (adv_vel > 0.0_wp) then
c0 = (2.0_wp*q3 + 5.0_wp*q4 - q5)/6.0_wp
b0 = beta5_0(q3, q4, q5)
c1 = (-q2 + 5.0_wp*q3 + 2.0_wp*q4)/6.0_wp
b1 = beta5_1(q2, q3, q4)
c2 = (2.0_wp*q1 - 7.0_wp*q2 + 11.0_wp*q3)/6.0_wp
b2 = beta5_2(q1, q2, q3)
else
c0 = (2.0_wp*q4 + 5.0_wp*q3 - q2)/6.0_wp
b0 = beta5_0(q4, q3, q2)
c1 = (-q5 + 5.0_wp*q4 + 2.0_wp*q3)/6.0_wp
b1 = beta5_1(q5, q4, q3)
c2 = (2.0_wp*q6 - 7.0_wp*q5 + 11.0_wp*q4)/6.0_wp
b2 = beta5_2(q6, q5, q4)
end if
tau = abs(b0 - b2)
w0 = 0.3_wp*fac_weno(tau, b0)
w1 = 0.6_wp*fac_weno(tau, b1)
w2 = 0.1_wp*fac_weno(tau, b2)
sinv = 1.0_wp/((w0 + w1) + w2)
qf = ((w0*c0) + (w1*c1) + (w2*c2))*sinv
end function weno5_recon