| Type | Intent | Optional | 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 |
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