fft_obj_GetRankFromLayout Function

private impure function fft_obj_GetRankFromLayout(this, idx, Ng) result(rank)

Returns the rank owning a given grid index

Type Bound

fft_obj

Arguments

Type IntentOptional 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

Return Value integer

Rank owning this index


Calls

proc~~fft_obj_getrankfromlayout~~CallsGraph proc~fft_obj_getrankfromlayout fft_obj%fft_obj_GetRankFromLayout mpi_cart_rank mpi_cart_rank proc~fft_obj_getrankfromlayout->mpi_cart_rank

Called by

proc~~fft_obj_getrankfromlayout~~CalledByGraph proc~fft_obj_getrankfromlayout fft_obj%fft_obj_GetRankFromLayout proc~fft_obj_transpose fft_obj%fft_obj_Transpose proc~fft_obj_transpose->proc~fft_obj_getrankfromlayout

Source Code

    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