SUBROUTINE mp_bcast_av(msg, source, gid)
CHARACTER(LEN=*) :: msg
INTEGER :: source
TYPE(mp_comm_type), INTENT(IN) :: gid
CHARACTER(LEN=*), PARAMETER :: routineN = 'mp_bcast_av'
INTEGER :: handle, ierr
#if defined(__parallel)
INTEGER :: i, msglen, numtask, taskid
INTEGER, DIMENSION(:), ALLOCATABLE :: imsg
#endif
ierr = 0
CALL timeset(routineN, handle)
#if defined(__parallel)
CALL mp_environ(numtask, taskid, gid)
IF (taskid == source) msglen = LEN_TRIM(msg)
CALL mp_bcast(msglen, source, gid)
! this is a workaround to avoid problems on the T3E
! at the moment we have a data alignment error when trying to
! broadcast characters on the T3E (not always!)
! JH 19/3/99 on galileo
! CALL mpi_bcast(msg,msglen,MPI_CHARACTER,source,gid,ierr)
ALLOCATE (imsg(1:msglen))
DO i = 1, msglen
imsg(i) = ICHAR(msg(i:i))
END DO
CALL mpi_bcast(imsg, msglen, MPI_INTEGER, source, gid%handle, ierr)
IF (ierr /= 0) CALL mp_stop(ierr, "mpi_bcast @ "//routineN)
msg = ""
DO i = 1, msglen
msg(i:i) = CHAR(imsg(i))
END DO
DEALLOCATE (imsg)
CALL add_perf(perf_id=2, msg_size=msglen*charlen)
#else
MARK_USED(msg)
MARK_USED(source)
MARK_USED(gid)
#endif
CALL timestop(handle)
END SUBROUTINE mp_bcast_av