PROGRAM MPIexample_pack IMPLICIT NONE INCLUDE "mpif.h" REAL(8), DIMENSION(2) :: SWV = 0.0 INTEGER :: XYdots = 0 INTEGER :: Niter = 1000 REAL(8) :: Range = 0.0 REAL :: tempo2, tempo1, tempro ! MPI variables CHARACTER(MPI_MAX_PROCESSOR_NAME) :: server INTEGER :: ierr, pos, my_rank, numprocs, ls CHARACTER(32) :: pckd_data ! call MPI_INIT( ierr ) call MPI_COMM_RANK( MPI_COMM_WORLD, my_rank, ierr ) call MPI_COMM_SIZE( MPI_COMM_WORLD, numprocs, ierr ) call MPI_Get_processor_name(server,ls,ierr) ! SWV = [0.0,1.0] XYdots = 101 Range = 1.0 Niter = 1000 IF ( my_rank == 0 ) THEN ! Master process looks for input data CALL CPU_TIME(tempo1) Pos = 0 CALL MPI_PACK (SWV, 2, MPI_DOUBLE_PRECISION, & & pckd_data, 32, pos, MPI_COMM_WORLD, ierr) CALL MPI_PACK (XYdots, 1, MPI_INTEGER, & & pckd_data, 32, pos, MPI_COMM_WORLD, ierr) CALL MPI_PACK (Range, 1, MPI_DOUBLE_PRECISION, & & pckd_data, 32, pos, MPI_COMM_WORLD, ierr) CALL MPI_PACK (NITER, 1, MPI_INTEGER, & & pckd_data, 32, pos, MPI_COMM_WORLD, ierr) print*,"Data sent: ",SWV,XYdots,Range,NITER ENDIF CALL MPI_BCAST (pckd_data, 32, MPI_PACKED , 0, & & MPI_COMM_WORLD, ierr) IF ( my_rank /= 0 ) THEN Pos = 0 CALL MPI_UNPACK (pckd_data, 32, pos, SWV, 2, MPI_DOUBLE_PRECISION, & & MPI_COMM_WORLD, ierr) CALL MPI_UNPACK (pckd_data, 32, pos, XYdots, 1, MPI_INTEGER, & & MPI_COMM_WORLD, ierr) CALL MPI_UNPACK (pckd_data, 32, pos, Range, 1, MPI_DOUBLE_PRECISION, & & MPI_COMM_WORLD, ierr) CALL MPI_UNPACK (pckd_data, 32, pos, NITER, 1, MPI_INTEGER, & & MPI_COMM_WORLD, ierr) print*,"Data rcvd: ",SWV,XYdots,Range,NITER ENDIF CALL CPU_TIME(tempo2) tempro = (tempo2 - tempo1) WRITE(*,*) "CPU time is ",tempro CALL MPI_BARRIER(MPI_COMM_WORLD,ierr) CALL Terminate(my_rank) STOP END PROGRAM MPIexample_pack SUBROUTINE Terminate(p) IMPLICIT NONE INTEGER, INTENT(IN) :: P INCLUDE "mpif.h" INTEGER :: ierr WRITE(*,*) "Process ",p," terminates" CALL MPI_Finalize(ierr) STOP END SUBROUTINE Terminate