PROGRAM SCATTERV USE MPI IMPLICIT NONE INTEGER, PARAMETER :: NPTS=38, NPROC=4, NRBUF=10 REAL*4, ALLOCATABLE :: SENDBUF(:), RECVBUF(:) REAL*4, ALLOCATABLE :: A(:), W(:), X(:) INTEGER :: SENDCOUNTS(0:NPROC-1), DISPLS(0:NPROC-1) INTEGER :: RECVCOUNT, MYRANK INTEGER :: NMIN, NEXTRA, K, I INTEGER :: SENDTYPE, RECVTYPE INTEGER :: ROOT, COMM, IERROR SENDTYPE = MPI_REAL RECVTYPE = MPI_REAL ROOT = 0 COMM = MPI_COMM_WORLD CALL MPI_INIT(IERROR) CALL MPI_COMM_RANK(COMM, MYRANK, IERROR) IF (MYRANK .EQ. 0) THEN ALLOCATE(SENDBUF(NPTS)) ALLOCATE(A(3),W(3),X(NPTS)) A = (/ 0.60, -0.30, 0.20 /) W = (/ 3.25, 1.45, 5.30 /) X = 0.1 * (/ (I, I = 0, NPTS-1) /) SENDBUF = A(1)*SIN(W(1)*X) & + A(2)*SIN(W(2)*X) + A(3)*SIN(W(3)*X) END IF ALLOCATE(RECVBUF(NRBUF)) NMIN = NPTS/NPROC NEXTRA = MOD(NPTS,NPROC) K = 0 DO I = 0, NPROC-1 IF (I .LT. NEXTRA) THEN SENDCOUNTS(I) = NMIN + 1 ELSE SENDCOUNTS(I) = NMIN END IF DISPLS(I) = K K = K + SENDCOUNTS(I) END DO ! Need to set recvcount also ... CALL MPI_SCATTERV( & SENDBUF, SENDCOUNTS, DISPLS, ... WRITE(*,'(I1,A1,10F7.3)') MYRANK, ':', & RECVBUF(1:RECVCOUNT) CALL MPI_FINALIZE(IERROR) STOP END PROGRAM SCATTERV