local_wavenumber_bounds Subroutine

private subroutine local_wavenumber_bounds(n_wavenumbers, nprocs, rank, first, last, nlocal)

Arguments

Type IntentOptional Attributes Name
integer, intent(in) :: n_wavenumbers
integer, intent(in) :: nprocs
integer, intent(in) :: rank
integer, intent(out) :: first
integer, intent(out) :: last
integer, intent(out) :: nlocal

Source Code

   subroutine local_wavenumber_bounds(n_wavenumbers, nprocs, rank, first, last, nlocal)
      integer, intent(in) :: n_wavenumbers, nprocs, rank
      integer, intent(out) :: first, last, nlocal
      integer :: base, rem

      if (nprocs <= 0) then
         first = 0; last = -1; nlocal = 0
         return
      end if
      base = n_wavenumbers / nprocs
      rem = mod(n_wavenumbers, nprocs)
      if (rank < rem) then
         nlocal = base + 1
         first = rank * (base + 1) + 1
      else
         nlocal = base
         first = rem * (base + 1) + (rank - rem) * base + 1
      end if
      last = first + nlocal - 1
      if (nlocal <= 0) then
         first = 0
         last = -1
      end if
   end subroutine local_wavenumber_bounds