Returns the rank owning a given grid index
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| class(fft_obj), | intent(inout) | :: | this |
A FFT object |
||
| integer, | intent(in) | :: | idx(3) |
Grid index |
||
| integer, | intent(in) | :: | Ng(3) |
Global grid points in each direction |
Rank owning this index
impure function fft_obj_GetRankFromLayout(this,idx,Ng) result(rank) !> Returns the rank owning a given grid index implicit none class(fft_obj), intent(inout) :: this !! A FFT object integer, intent(in) :: idx(3) !! Grid index integer, intent(in) :: Ng(3) !! Global grid points in each direction integer :: rank !! Rank owning this index ! Work variables integer :: dir, p integer :: l_dims integer :: hi,lo integer :: offset integer :: rank_cart(3) integer :: ierr ! Linear search rank_cart = 0 do dir=1,3 offset = 0 p = 0 do while(rank_cart(dir).eq.0) !print*, "dir,p=", dir,p l_dims = Ng(dir)/this%parallel%np(dir) if (p .lt. mod(Ng(dir),this%parallel%np(dir))) l_dims = l_dims + 1 !if (idx(dir).gt.offset.and.idx(dir).le.offset+l_dims) then lo = offset + 1 hi = lo + l_dims - 1 if (idx(dir).ge.lo.and.idx(dir).le.hi) then rank_cart(dir) = p + 1 else p = p + 1 offset = offset + l_dims end if end do end do ! Get rank from the MPI cartesian topology call MPI_CART_RANK(this%parallel%comm%g,rank_cart-1,rank,ierr) ! Adjust rank to be 1-based (instead of 0-based ranks returned by MPI) rank = rank + 1 return end function fft_obj_GetRankFromLayout