pure function weno_face_conc_y(nx, ny, nz, tr, wet_T, ii, cc, kk, d, &
avail_up, avail_down, rung_max, cfl) result(conc)
!! Meridional analogue of weno_face_conc_x. `cc` is the donor cell
!! (j-index); the stencil steps along j with `d = +1` (u>0) / `-1` (u<0).
!$acc routine seq
integer, intent(in) :: nx, ny, nz, ii, cc, kk, d, avail_up, avail_down, rung_max
real(wp), intent(in) :: tr(nx, ny, nz), wet_T(nx, ny)
real(wp), intent(in) :: cfl
real(wp) :: conc
integer :: rung, jp, jm
real(wp) :: q0, qp1, qp2, qp3, qp4, qm1, qm2, qm3, qm4
rung = recon_rung_for_face(avail_up, avail_down, rung_max)
q0 = tr(ii, cc, kk)
if (rung <= 0) then
conc = q0
return
end if
jp = min(max(cc + d, 1), ny)
jm = min(max(cc - d, 1), ny)
qp1 = ppm_mirror_h(tr(ii, jp, kk), q0, wet_T(ii, jp))
qm1 = ppm_mirror_h(tr(ii, jm, kk), q0, wet_T(ii, jm))
if (rung == 1) then
conc = plm_face_swept(qm1, q0, qp1, cfl)
return
end if
jp = min(max(cc + 2*d, 1), ny)
jm = min(max(cc - 2*d, 1), ny)
qp2 = ppm_mirror_h(tr(ii, jp, kk), qp1, wet_T(ii, jp))
qm2 = ppm_mirror_h(tr(ii, jm, kk), qm1, wet_T(ii, jm))
if (rung == 2) then
conc = weno5_face_swept(qm2, qm1, q0, qp1, qp2, cfl)
return
end if
jp = min(max(cc + 3*d, 1), ny)
jm = min(max(cc - 3*d, 1), ny)
qp3 = ppm_mirror_h(tr(ii, jp, kk), qp2, wet_T(ii, jp))
qm3 = ppm_mirror_h(tr(ii, jm, kk), qm2, wet_T(ii, jm))
if (rung == 3) then
conc = weno7_face_swept(qm3, qm2, qm1, q0, qp1, qp2, qp3, cfl)
return
end if
jp = min(max(cc + 4*d, 1), ny)
jm = min(max(cc - 4*d, 1), ny)
qp4 = ppm_mirror_h(tr(ii, jp, kk), qp3, wet_T(ii, jp))
qm4 = ppm_mirror_h(tr(ii, jm, kk), qm3, wet_T(ii, jm))
conc = weno9_face_swept(qm4, qm3, qm2, qm1, q0, qp1, qp2, qp3, qp4, cfl)
end function weno_face_conc_y