pure subroutine wavespeed_compute_impl(nx, ny, nz, rho0, h_layer, rho_layer, &
wet_mask, f_centre, beta_centre, dxT, &
cg1, rd, rd_over_dx)
!! Flat-impl wavespeed kernel (explicit-shape; NVHPC
!! descriptor-walk-free). Per-column Sturm-Liouville solve
!! (`wavespeed_cg1_column`) + the deformation-radius blend
!! (`wavespeed_rd`), then the metres-denominated resolution ratio
!! `rd_over_dx = rd / dxT`.
integer, intent(in) :: nx, ny, nz
real(wp), intent(in) :: rho0
real(wp), intent(in) :: h_layer(nx, ny, nz), rho_layer(nx, ny, nz)
real(wp), intent(in) :: wet_mask(nx, ny)
real(wp), intent(in) :: f_centre(nx, ny), beta_centre(nx, ny), dxT(nx, ny)
real(wp), intent(out) :: cg1(nx, ny), rd(nx, ny), rd_over_dx(nx, ny)
integer :: i, j, k
real(wp) :: h_col(NZ_STACK_MAX), rho_col(NZ_STACK_MAX)
real(wp) :: cg1_v, rd_v
do concurrent(j=1:ny, i=1:nx) &
local(k, h_col, rho_col, cg1_v, rd_v)
cg1_v = 0.0_wp
rd_v = 0.0_wp
if (wet_mask(i, j) > 0.0_wp .and. nz >= 2) then
do k = 1, nz
h_col(k) = h_layer(i, j, k)
rho_col(k) = rho_layer(i, j, k)
end do
call wavespeed_cg1_column(nz, h_col, rho_col, rho0, cg1_v)
rd_v = wavespeed_rd(cg1_v, f_centre(i, j), beta_centre(i, j))
end if
cg1(i, j) = cg1_v
rd(i, j) = rd_v
rd_over_dx(i, j) = rd_v/max(dxT(i, j), F_DENOM_FLOOR)
end do
end subroutine wavespeed_compute_impl