! ! (C) 2004 by Argonne National Laboratory. ! See COPYRIGHT in top-level directory. ! ! Thanks to ! William R. Magro ! for this test ! ! It has been modifiedly slightly to work with the automated MPI ! tests. ! WDG. ! ! It was further modified to use MPI_Get_address instead of MPI_Address ! for MPICH, and to fit in the MPICH test harness - WDG ! program bustit implicit none use mpi integer comm integer newtype integer me integer position integer type(5) integer length(5) integer (kind=MPI_ADDRESS_KIND) disp(5) integer bufsize integer errs, toterrs parameter (bufsize=100) character buf(bufsize) character name*(10) integer status(MPI_STATUS_SIZE) integer i, size double precision x integer src, dest integer ierr errs = 0 ! Enroll in MPI call mpi_init(ierr) ! get my rank call mpi_comm_rank(MPI_COMM_WORLD, me, ierr) call mpi_comm_size(MPI_COMM_WORLD, size, ierr ) if (size .lt. 2) then print *, "Must have at least 2 processes" call MPI_Abort( 1, MPI_COMM_WORLD, ierr ) endif comm = MPI_COMM_WORLD src = 0 dest = 1 if(me.eq.src) then i=5 x=5.1234d0 name="Hello" type(1)=MPI_CHARACTER length(1)=5 call mpi_get_address(name,disp(1),ierr) type(2)=MPI_DOUBLE_PRECISION length(2)=1 call mpi_get_address(x,disp(2),ierr) call mpi_type_create_struct(2,length,disp,type,newtype,ierr) call mpi_type_commit(newtype,ierr) call mpi_barrier( MPI_COMM_WORLD, ierr ) call mpi_send(MPI_BOTTOM,1,newtype,dest,1,comm,ierr) call mpi_type_free(newtype,ierr) ! write(*,*) "Sent ",name(1:5),x else ! Everyone calls barrier incase size > 2 call mpi_barrier( MPI_COMM_WORLD, ierr ) if (me.eq.dest) then position=0 name = " " x = 0.0d0 call mpi_recv(buf,bufsize,MPI_PACKED, src, & & 1, comm, status, ierr) call mpi_unpack(buf,bufsize,position, & & name,5,MPI_CHARACTER, comm,ierr) call mpi_unpack(buf,bufsize,position, & & x,1,MPI_DOUBLE_PRECISION, comm,ierr) ! Check the return values (/= is not-equal in F90) if (name /= "Hello") then errs = errs + 1 print *, "Received ", name, " but expected Hello" endif if (abs(x-5.1234) .gt. 1.0e-6) then errs = errs + 1 print *, "Received ", x, " but expected 5.1234" endif endif endif ! ! Sum up errs and report the result call mpi_reduce( errs, toterrs, 1, MPI_INTEGER, MPI_SUM, 0, & & MPI_COMM_WORLD, ierr ) if (me .eq. 0) then if (toterrs .eq. 0) then print *, " No Errors" else print *, " Found ", toterrs, " errors" endif endif call mpi_finalize(ierr) end