pure subroutine drain_reconstruct_hprev(nx, ny, nz, areaT, iareaT, h_end, &
uhtr, vhtr, hprev)
!! hprev = max(0, areaT·h_end + div(uhtr,vhtr)) · iareaT, then the
!! vanishing-layer hatch `hprev += max(0, 1e-13·hprev − h_end)`
!! (Adcroft & Hallberg 2006; reuse of VANISHING_LAYER_TOL thinking).
integer, intent(in) :: nx, ny, nz
real(wp), intent(in) :: areaT(nx, ny), iareaT(nx, ny)
real(wp), intent(in) :: h_end(nx, ny, nz)
real(wp), intent(in) :: uhtr(nx + 1, ny, nz)
real(wp), intent(in) :: vhtr(nx, ny + 1, nz)
real(wp), intent(inout) :: hprev(nx, ny, nz)
integer :: i, j, k
real(wp) :: vol, eps_h
do concurrent(k=1:nz, j=1:ny, i=1:nx) local(vol, eps_h)
vol = areaT(i, j)*h_end(i, j, k) &
+ (uhtr(i + 1, j, k) - uhtr(i, j, k)) &
+ (vhtr(i, j + 1, k) - vhtr(i, j, k))
hprev(i, j, k) = max(0.0_wp, vol)*iareaT(i, j)
eps_h = max(0.0_wp, 1.0e-13_wp*hprev(i, j, k) - h_end(i, j, k))
hprev(i, j, k) = hprev(i, j, k) + eps_h
end do
end subroutine drain_reconstruct_hprev