block_obj_Locate Function

private impure function block_obj_Locate(this, p) result(rank)

Uses

  • proc~~block_obj_locate~~UsesGraph proc~block_obj_locate block_obj%block_obj_Locate mpi_f08 mpi_f08 proc~block_obj_locate->mpi_f08

Returns block ID and rank of the block where the point is located using a binary search alogirthm. Note that this function assumes that the point is within the domain, i.e., (pmin <= p <= pmax) and that any treatment for periodicity has been previously applied.

Type Bound

block_obj

Arguments

Type IntentOptional Attributes Name
class(block_obj), intent(in) :: this

A block object

real(kind=wp), intent(in) :: p(3)

Position to locate

Return Value integer

MPI rank


Calls

proc~~block_obj_locate~~CallsGraph proc~block_obj_locate block_obj%block_obj_Locate mpi_cart_rank mpi_cart_rank proc~block_obj_locate->mpi_cart_rank

Called by

proc~~block_obj_locate~~CalledByGraph proc~block_obj_locate block_obj%block_obj_Locate proc~lagrangian_set_getownerrankbyblock lagrangian_set%lagrangian_set_GetOwnerRankByBlock proc~lagrangian_set_getownerrankbyblock->proc~block_obj_locate proc~respart_set_regroup ResPart_set%ResPart_set_Regroup proc~respart_set_regroup->proc~block_obj_locate proc~cdifs_obj_advancesolutionrp cdifs_obj_AdvanceSolutionRP proc~cdifs_obj_advancesolutionrp->proc~respart_set_regroup proc~respart_set_gethydroforces ResPart_set%ResPart_set_GetHydroForces proc~cdifs_obj_advancesolutionrp->proc~respart_set_gethydroforces proc~grans_obj_advancesolution grans_obj_AdvanceSolution proc~grans_obj_advancesolution->proc~respart_set_regroup proc~respart_set_gethydroforces->proc~respart_set_regroup interface~grans_obj_advancesolution grans_obj%grans_obj_AdvanceSolution interface~grans_obj_advancesolution->proc~grans_obj_advancesolution proc~cdifs_obj_advancesolution cdifs_obj_AdvanceSolution proc~cdifs_obj_advancesolution->proc~cdifs_obj_advancesolutionrp interface~cdifs_obj_advancesolution cdifs_obj%cdifs_obj_AdvanceSolution interface~cdifs_obj_advancesolution->proc~cdifs_obj_advancesolution

Source Code

    impure function block_obj_Locate(this,p) result (rank)
      !> Returns block ID and rank of the block
      ! where the point is located using a binary search
      ! alogirthm. Note that this function assumes that
      ! the point is within the domain, i.e., (pmin <= p <= pmax)
      ! and that any treatment for periodicity has been
      ! previously applied.
      use mpi_f08
      implicit none
      class(block_obj), intent(in) :: this                                     !! A block object
      real(wp),         intent(in) :: p(3)                                     !! Position to locate
      integer                      :: rank                                     !! MPI rank
      ! Work variables
      integer :: dir
      integer :: ind(3)
      integer :: i_lo
      integer :: i_hi
      integer :: ierr

      associate(axis_p => this%axis_partition, np => this%parallel%np)

        do dir=1,3
          ! Find block index using binary search
          i_lo = axis_p(dir)%lo
          i_hi = axis_p(dir)%hi + 1

          do while (i_hi-i_lo.ge.2)
            ind(dir) = (i_hi+i_lo)/2

            if (p(dir).ge.axis_p(dir)%x( ind(dir) )) then
              i_lo = ind(dir)
            else
              i_hi = ind(dir)
            end if

          end do

          ind(dir) = i_lo
        end do

        ! Get rank from the MPI cartesian topology
        call MPI_CART_RANK(this%parallel%comm%g,ind-1,rank,ierr)

        ! Adjust rank to be 1-based (instead of 0-based ranks returned by MPI)
        rank = rank + 1
      end associate

      return
    end function block_obj_Locate