PROGRAM MPIexample_pack IMPLICIT NONE INCLUDE "mpif.h" TYPE composed SEQUENCE REAL(8), DIMENSION(2) :: SWV = 0.0 REAL(8) :: Range = 0.0 INTEGER :: XYdots = 0 INTEGER :: Niter = 1000 END TYPE composed TYPE(composed) :: values REAL :: tempo2, tempo1, tempro ! MPI variables CHARACTER(MPI_MAX_PROCESSOR_NAME) :: server INTEGER :: ierr, my_rank, numprocs, new_type, ls INTEGER :: num_blk, v_len_blk(4), v_head(4), v_el_typ(4) ! 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) ! IF ( my_rank == 0 ) THEN values%SWV = [0.0,1.0] values%XYdots = 101 values%Range = 1.0 values%Niter = 1000 CALL CPU_TIME(tempo1) ENDIF num_blk = 4 v_len_blk = [2,1,1,1] v_head = [0,16,24,28] v_el_typ = [MPI_DOUBLE_PRECISION,MPI_DOUBLE_PRECISION,MPI_INTEGER, & & MPI_INTEGER] CALL MPI_Type_struct(num_blk,v_len_blk,v_head,v_el_typ,new_type,ierr) CALL MPI_Type_commit(new_type,ierr) ! Ready for broadcasting data CALL MPI_BCAST (values, 1, new_type , 0, & & MPI_COMM_WORLD, ierr) IF ( my_rank == 0 ) THEN print*,"Data sent: ",values ELSE print*,"Data rcvd: ",values ENDIF CALL MPI_BARRIER(MPI_COMM_WORLD,ierr) IF ( my_rank == 0 ) THEN CALL CPU_TIME(tempo2) tempro = (tempo2 - tempo1) WRITE(*,*) "CPU time is ",tempro ENDIF 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