hvisc_ke_diss_impl Subroutine

private pure subroutine hvisc_ke_diss_impl(nx, ny, nz, u_face, v_face, du_visc, dv_visc, rho_layer, h_layer, ke_diss)

C-grid KE budget: each face’s u·du_visc rate is split half to each adjacent T-cell and depth-integrated with ρ_k h_k. Race-free — every (i,j) writes only its own ke_diss(i,j).

Arguments

Type IntentOptional Attributes Name
integer, intent(in) :: nx
integer, intent(in) :: ny
integer, intent(in) :: nz
real(kind=wp), intent(in) :: u_face(nx+1,ny,nz)
real(kind=wp), intent(in) :: v_face(nx,ny+1,nz)
real(kind=wp), intent(in) :: du_visc(nx+1,ny,nz)
real(kind=wp), intent(in) :: dv_visc(nx,ny+1,nz)
real(kind=wp), intent(in) :: rho_layer(nx,ny,nz)
real(kind=wp), intent(in) :: h_layer(nx,ny,nz)
real(kind=wp), intent(inout) :: ke_diss(nx,ny)

Calls

proc~~hvisc_ke_diss_impl~~CallsGraph proc~hvisc_ke_diss_impl hvisc_ke_diss_impl local local proc~hvisc_ke_diss_impl->local

Called by

proc~~hvisc_ke_diss_impl~~CalledByGraph proc~hvisc_ke_diss_impl hvisc_ke_diss_impl proc~ocean_horizontal_viscosity_compute_ke_diss ocean_horizontal_viscosity_compute_ke_diss proc~ocean_horizontal_viscosity_compute_ke_diss->proc~hvisc_ke_diss_impl proc~run_stage run_stage proc~run_stage->proc~ocean_horizontal_viscosity_compute_ke_diss proc~run_stage_split run_stage_split proc~run_stage_split->proc~ocean_horizontal_viscosity_compute_ke_diss proc~ocean_dyn_step ocean_dyn_step proc~ocean_dyn_step->proc~run_stage proc~ocean_dyn_step_split ocean_dyn_step_split proc~ocean_dyn_step_split->proc~run_stage_split proc~engine_step engine_step proc~engine_step->proc~ocean_dyn_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

Variables

Type Visibility Attributes Name Initial
real(kind=wp), private :: acc
integer, private :: i
integer, private :: j
integer, private :: k
real(kind=wp), private :: ke

Source Code

   pure subroutine hvisc_ke_diss_impl(nx, ny, nz, u_face, v_face, du_visc, dv_visc, &
                                      rho_layer, h_layer, ke_diss)
      !! C-grid KE budget: each face's `u·du_visc` rate is split half to each
      !! adjacent T-cell and depth-integrated with `ρ_k h_k`.  Race-free —
      !! every (i,j) writes only its own `ke_diss(i,j)`.
      integer, intent(in) :: nx, ny, nz
      real(wp), intent(in) :: u_face(nx + 1, ny, nz), v_face(nx, ny + 1, nz)
      real(wp), intent(in) :: du_visc(nx + 1, ny, nz), dv_visc(nx, ny + 1, nz)
      real(wp), intent(in) :: rho_layer(nx, ny, nz), h_layer(nx, ny, nz)
      real(wp), intent(inout) :: ke_diss(nx, ny)
      integer :: i, j, k
      real(wp) :: acc, ke
      do concurrent(j=1:ny, i=1:nx) local(acc, ke, k)
         acc = 0.0_wp
         do k = 1, nz
            ke = 0.5_wp*(u_face(i, j, k)*du_visc(i, j, k) &
                         + u_face(i + 1, j, k)*du_visc(i + 1, j, k)) &
                 + 0.5_wp*(v_face(i, j, k)*dv_visc(i, j, k) &
                           + v_face(i, j + 1, k)*dv_visc(i, j + 1, k))
            acc = acc + rho_layer(i, j, k)*h_layer(i, j, k)*ke
         end do
         ke_diss(i, j) = acc
      end do
   end subroutine hvisc_ke_diss_impl