wavespeed_compute_impl Subroutine

private 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.

Arguments

Type IntentOptional Attributes Name
integer, intent(in) :: nx
integer, intent(in) :: ny
integer, intent(in) :: nz
real(kind=wp), intent(in) :: rho0
real(kind=wp), intent(in) :: h_layer(nx,ny,nz)
real(kind=wp), intent(in) :: rho_layer(nx,ny,nz)
real(kind=wp), intent(in) :: wet_mask(nx,ny)
real(kind=wp), intent(in) :: f_centre(nx,ny)
real(kind=wp), intent(in) :: beta_centre(nx,ny)
real(kind=wp), intent(in) :: dxT(nx,ny)
real(kind=wp), intent(out) :: cg1(nx,ny)
real(kind=wp), intent(out) :: rd(nx,ny)
real(kind=wp), intent(out) :: rd_over_dx(nx,ny)

Calls

proc~~wavespeed_compute_impl~~CallsGraph proc~wavespeed_compute_impl wavespeed_compute_impl local local proc~wavespeed_compute_impl->local proc~wavespeed_cg1_column wavespeed_cg1_column proc~wavespeed_compute_impl->proc~wavespeed_cg1_column proc~wavespeed_rd wavespeed_rd proc~wavespeed_compute_impl->proc~wavespeed_rd proc~det_sign det_sign proc~wavespeed_cg1_column->proc~det_sign proc~sturm_count sturm_count proc~wavespeed_cg1_column->proc~sturm_count

Called by

proc~~wavespeed_compute_impl~~CalledByGraph proc~wavespeed_compute_impl wavespeed_compute_impl proc~wavespeed_compute wavespeed_compute proc~wavespeed_compute->proc~wavespeed_compute_impl proc~ocean_dyn_step_split ocean_dyn_step_split proc~ocean_dyn_step_split->proc~wavespeed_compute proc~engine_step engine_step proc~engine_step->proc~ocean_dyn_step_split proc~driver_run_ocean driver_run_ocean proc~driver_run_ocean->proc~engine_step proc~rdb_ocean_step rdb_ocean_step proc~rdb_ocean_step->proc~engine_step proc~driver_run driver_run proc~driver_run->proc~driver_run_ocean

Variables

Type Visibility Attributes Name Initial
real(kind=wp), private :: cg1_v
real(kind=wp), private :: h_col(NZ_STACK_MAX)
integer, private :: i
integer, private :: j
integer, private :: k
real(kind=wp), private :: rd_v
real(kind=wp), private :: rho_col(NZ_STACK_MAX)

Source Code

   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