SUBROUTINE mp_rank_compare(comm1, comm2, rank)
TYPE(mp_comm_type), INTENT(IN) :: comm1, comm2
INTEGER, DIMENSION(:), CONTIGUOUS, INTENT(OUT) :: rank
CHARACTER(LEN=*), PARAMETER :: routineN = 'mp_rank_compare'
INTEGER :: handle, ierr
#if defined(__parallel)
INTEGER :: i, n, n1, n2
INTEGER, ALLOCATABLE, DIMENSION(:) :: rin
MPI_GROUP_TYPE :: g1, g2
#endif
ierr = 0
CALL timeset(routineN, handle)
rank = 0
#if defined(__parallel)
CALL mpi_comm_size(comm1%handle, n1, ierr)
IF (ierr /= 0) CALL mp_stop(ierr, "mpi_comm_size @ "//routineN)
CALL mpi_comm_size(comm2%handle, n2, ierr)
IF (ierr /= 0) CALL mp_stop(ierr, "mpi_comm_size @ "//routineN)
n = MAX(n1, n2)
CALL mpi_comm_group(comm1%handle, g1, ierr)
IF (ierr /= 0) CALL mp_stop(ierr, "mpi_comm_group @ "//routineN)
CALL mpi_comm_group(comm2%handle, g2, ierr)
IF (ierr /= 0) CALL mp_stop(ierr, "mpi_comm_group @ "//routineN)
ALLOCATE (rin(0:n - 1), STAT=ierr)
IF (ierr /= 0) &
DBCSR_ABORT("allocate @ "//routineN)
DO i = 0, n - 1
rin(i) = i
END DO
CALL mpi_group_translate_ranks(g1, n, rin, g2, rank, ierr)
IF (ierr /= 0) CALL mp_stop(ierr, &
"mpi_group_translate_rank @ "//routineN)
CALL mpi_group_free(g1, ierr)
IF (ierr /= 0) &
DBCSR_ABORT("group_free @ "//routineN)
CALL mpi_group_free(g2, ierr)
IF (ierr /= 0) &
DBCSR_ABORT("group_free @ "//routineN)
DEALLOCATE (rin)
#else
MARK_USED(comm1)
MARK_USED(comm2)
#endif
CALL timestop(handle)
END SUBROUTINE mp_rank_compare