pure function weno7_recon(q1, q2, q3, q4, q5, q6, q7, q8, adv_vel) result(qf)
!! 7th-order WENO-Z reconstruction (MOM6 `weno_seven_h_weight_reconstruction`)
!! of an 8-point corner stencil onto the face between the two central points
!! `q4,q5`, upwind-biased on `adv_vel`. Four 4-point candidates blended by
!! WENO-Z (ideal weights 4/35, 18/35, 12/35, 1/35; Balsara-Shu smoothness;
!! tau = |(b0-b3) + 3(b1-b2)|). Applied to the absolute vorticity directly.
!! Radius 4 (nghost>=4).
!$acc routine seq
real(wp), intent(in) :: q1, q2, q3, q4, q5, q6, q7, q8
real(wp), intent(in) :: adv_vel
real(wp) :: qf
real(wp) :: c0, c1, c2, c3, b0, b1, b2, b3, tau, w0, w1, w2, w3, sinv
if (adv_vel > 0.0_wp) then
c0 = (6.0_wp*q4 + 26.0_wp*q5 - 10.0_wp*q6 + 2.0_wp*q7)/24.0_wp
b0 = beta7_0(q4, q5, q6, q7)
c1 = (-2.0_wp*q3 + 14.0_wp*q4 + 14.0_wp*q5 - 2.0_wp*q6)/24.0_wp
b1 = beta7_1(q3, q4, q5, q6)
c2 = (2.0_wp*q2 - 10.0_wp*q3 + 26.0_wp*q4 + 6.0_wp*q5)/24.0_wp
b2 = beta7_2(q2, q3, q4, q5)
c3 = (-6.0_wp*q1 + 26.0_wp*q2 - 46.0_wp*q3 + 50.0_wp*q4)/24.0_wp
b3 = beta7_3(q1, q2, q3, q4)
else
c0 = (6.0_wp*q5 + 26.0_wp*q4 - 10.0_wp*q3 + 2.0_wp*q2)/24.0_wp
b0 = beta7_0(q5, q4, q3, q2)
c1 = (-2.0_wp*q6 + 14.0_wp*q5 + 14.0_wp*q4 - 2.0_wp*q3)/24.0_wp
b1 = beta7_1(q6, q5, q4, q3)
c2 = (2.0_wp*q7 - 10.0_wp*q6 + 26.0_wp*q5 + 6.0_wp*q4)/24.0_wp
b2 = beta7_2(q7, q6, q5, q4)
c3 = (-6.0_wp*q8 + 26.0_wp*q7 - 46.0_wp*q6 + 50.0_wp*q5)/24.0_wp
b3 = beta7_3(q8, q7, q6, q5)
end if
tau = abs((b0 - b3) + 3.0_wp*(b1 - b2))
w0 = (4.0_wp/35.0_wp)*fac_weno(tau, b0)
w1 = (18.0_wp/35.0_wp)*fac_weno(tau, b1)
w2 = (12.0_wp/35.0_wp)*fac_weno(tau, b2)
w3 = (1.0_wp/35.0_wp)*fac_weno(tau, b3)
sinv = 1.0_wp/((w0 + w1) + (w2 + w3))
qf = ((w0*c0) + (w1*c1) + (w2*c2) + (w3*c3))*sinv
end function weno7_recon