drain_swept_flux_y_weno Subroutine

private pure subroutine drain_swept_flux_y_weno(nx, ny, nz, nghost, periodic, areaT, uhh, hprev, tr, wet_T, recon, F)

Meridional analogue of drain_swept_flux_x_weno.

Arguments

Type IntentOptional Attributes Name
integer, intent(in) :: nx
integer, intent(in) :: ny
integer, intent(in) :: nz
integer, intent(in) :: nghost
logical, intent(in) :: periodic
real(kind=wp), intent(in) :: areaT(nx,ny)
real(kind=wp), intent(in) :: uhh(nx,ny+1,nz)
real(kind=wp), intent(in) :: hprev(nx,ny,nz)
real(kind=wp), intent(in) :: tr(nx,ny,nz)
real(kind=wp), intent(in) :: wet_T(nx,ny)
integer, intent(in) :: recon
real(kind=wp), intent(inout) :: F(nx,ny+1,nz)

Calls

proc~~drain_swept_flux_y_weno~~CallsGraph proc~drain_swept_flux_y_weno drain_swept_flux_y_weno local local proc~drain_swept_flux_y_weno->local proc~weno_face_conc_y weno_face_conc_y proc~drain_swept_flux_y_weno->proc~weno_face_conc_y proc~plm_face_swept plm_face_swept proc~weno_face_conc_y->proc~plm_face_swept proc~ppm_mirror_h ppm_mirror_h proc~weno_face_conc_y->proc~ppm_mirror_h proc~recon_rung_for_face recon_rung_for_face proc~weno_face_conc_y->proc~recon_rung_for_face proc~weno5_face_swept weno5_face_swept proc~weno_face_conc_y->proc~weno5_face_swept proc~weno7_face_swept weno7_face_swept proc~weno_face_conc_y->proc~weno7_face_swept proc~weno9_face_swept weno9_face_swept proc~weno_face_conc_y->proc~weno9_face_swept

Called by

proc~~drain_swept_flux_y_weno~~CalledByGraph proc~drain_swept_flux_y_weno drain_swept_flux_y_weno proc~continuity_tracer_drain continuity_tracer_drain proc~continuity_tracer_drain->proc~drain_swept_flux_y_weno proc~ocean_dyn_flush_tracer_window ocean_dyn_flush_tracer_window proc~ocean_dyn_flush_tracer_window->proc~continuity_tracer_drain proc~ocean_dyn_step ocean_dyn_step proc~ocean_dyn_step->proc~continuity_tracer_drain proc~ocean_dyn_step_split ocean_dyn_step_split proc~ocean_dyn_step_split->proc~continuity_tracer_drain proc~driver_run_ocean driver_run_ocean proc~driver_run_ocean->proc~ocean_dyn_flush_tracer_window proc~engine_step engine_step proc~driver_run_ocean->proc~engine_step proc~engine_step->proc~ocean_dyn_step proc~engine_step->proc~ocean_dyn_step_split proc~rdb_ocean_set_tracer rdb_ocean_set_tracer proc~rdb_ocean_set_tracer->proc~ocean_dyn_flush_tracer_window proc~driver_run driver_run proc~driver_run->proc~driver_run_ocean proc~rdb_ocean_step rdb_ocean_step proc~rdb_ocean_step->proc~engine_step

Variables

Type Visibility Attributes Name Initial
integer, private :: avail_down
integer, private :: avail_up
real(kind=wp), private :: cfl
real(kind=wp), private :: conc
integer, private :: i
integer, private :: j
integer, private :: k
integer, private :: rung_max
real(kind=wp), private :: u
real(kind=wp), private :: vol

Source Code

   pure subroutine drain_swept_flux_y_weno(nx, ny, nz, nghost, periodic, areaT, uhh, &
                                           hprev, tr, wet_T, recon, F)
      !! Meridional analogue of drain_swept_flux_x_weno.
      integer, intent(in) :: nx, ny, nz, nghost, recon
      logical, intent(in) :: periodic
      real(wp), intent(in) :: areaT(nx, ny)
      real(wp), intent(in) :: uhh(nx, ny + 1, nz)
      real(wp), intent(in) :: hprev(nx, ny, nz)
      real(wp), intent(in) :: tr(nx, ny, nz)
      real(wp), intent(in) :: wet_T(nx, ny)
      real(wp), intent(inout) :: F(nx, ny + 1, nz)
      integer :: i, j, k, rung_max, avail_up, avail_down
      real(wp) :: u, cfl, vol, conc
      rung_max = recon + 1
      do concurrent(k=1:nz, i=1:nx)
         F(i, 1, k) = 0.0_wp
         F(i, ny + 1, k) = 0.0_wp
      end do
      do concurrent(k=1:nz, j=2:ny, i=1:nx) local(u, cfl, vol, conc, avail_up, avail_down)
         u = uhh(i, j, k)
         if (u > 0.0_wp) then
            vol = max(areaT(i, j - 1)*hprev(i, j - 1, k), DRAIN_MIN_VOL)
            cfl = min(u/vol, 1.0_wp)
            if (periodic) then
               avail_up = ny
               avail_down = ny
            else
               avail_up = j - nghost
               avail_down = ny - nghost - j + 2
            end if
            conc = weno_face_conc_y(nx, ny, nz, tr, wet_T, i, j - 1, k, 1, &
                                    avail_up, avail_down, rung_max, cfl)
            F(i, j, k) = u*conc
         else if (u < 0.0_wp) then
            vol = max(areaT(i, j)*hprev(i, j, k), DRAIN_MIN_VOL)
            cfl = min(-u/vol, 1.0_wp)
            if (periodic) then
               avail_up = ny
               avail_down = ny
            else
               avail_up = ny - nghost - j + 2
               avail_down = j - nghost
            end if
            conc = weno_face_conc_y(nx, ny, nz, tr, wet_T, i, j, k, -1, &
                                    avail_up, avail_down, rung_max, cfl)
            F(i, j, k) = u*conc
         else
            F(i, j, k) = 0.0_wp
         end if
      end do
   end subroutine drain_swept_flux_y_weno