pure function redi_sublayer_dT(nz, klt, klb, krt, krb, &
PoLt, PoLb, PoRt, PoRb, &
TlL, TiL, aLL, aRL, TlR, TiR, aLR, aRR) result(dT)
!$acc routine seq
!! Along-neutral tracer difference for one sublayer (MOM6
!! neutral_surface_flux continuous branch). TOP-DOWN layer indices
!! (klt/klb = KoL at the surface/bed bound of the sublayer; krt/krb
!! mirror) and fractional positions. Returns dT_layer when the
!! top/bottom/ave/layer triad is sign-consistent, else 0 (the
!! down-gradient guard that prevents up-gradient transport).
integer, intent(in) :: nz, klt, klb, krt, krb
real(wp), intent(in) :: PoLt, PoLb, PoRt, PoRb
real(wp), intent(in) :: TlL(NZ_STACK_MAX), TiL(NZ_STACK_MAX + 1), aLL(NZ_STACK_MAX), aRL(NZ_STACK_MAX)
real(wp), intent(in) :: TlR(NZ_STACK_MAX), TiR(NZ_STACK_MAX + 1), aLR(NZ_STACK_MAX), aRR(NZ_STACK_MAX)
real(wp) :: dT
real(wp) :: tlt, tlb, trt, trb, tlay, trlay, dT_top, dT_bot, dT_ave, dT_layer
tlt = (1.0_wp - PoLt)*TiL(klt) + PoLt*TiL(klt + 1)
tlb = (1.0_wp - PoLb)*TiL(klb) + PoLb*TiL(klb + 1)
trt = (1.0_wp - PoRt)*TiR(krt) + PoRt*TiR(krt + 1)
trb = (1.0_wp - PoRb)*TiR(krb) + PoRb*TiR(krb + 1)
tlay = redi_ppm_ave(PoLt, PoLb + real(klb - klt, wp), aLL(klt), aRL(klt), TlL(klt))
trlay = redi_ppm_ave(PoRt, PoRb + real(krb - krt, wp), aLR(krt), aRR(krt), TlR(krt))
dT_top = trt - tlt
dT_bot = trb - tlb
dT_ave = 0.5_wp*(dT_top + dT_bot)
dT_layer = trlay - tlay
if (redi_signum1(dT_top)*redi_signum1(dT_bot) <= 0.0_wp .or. &
redi_signum1(dT_ave)*redi_signum1(dT_layer) <= 0.0_wp) then
dT = 0.0_wp
else
dT = dT_layer
end if
end function redi_sublayer_dT