! -*- Mode: Fortran; -*- ! ! (C) 2013 by Argonne National Laboratory. ! See COPYRIGHT in top-level directory. ! ! Based on a test written by Jim Hoekstra on behalf of Cray, Inc. ! see ticket #884 https://trac.mpich.org/projects/mpich/ticket/884 PROGRAM get_elem_u USE mpi IMPLICIT NONE INTEGER RANK, SIZE, IERR, COMM, errs INTEGER MAX, I, K, dest INTEGER STATUS(MPI_STATUS_SIZE) INTEGER, PARAMETER :: nb=2 INTEGER :: blklen(nb)=(/1,1/) INTEGER :: types(nb)=(/MPI_DOUBLE_PRECISION,MPI_CHAR/) INTEGER(kind=MPI_ADDRESS_KIND) :: disp(nb)=(/0,8/) INTEGER, PARAMETER :: amax=200 INTEGER :: type1, type2, extent REAL :: a(amax) errs = 0 CALL MPI_Init( ierr ) COMM = MPI_COMM_WORLD CALL MPI_Comm_rank(COMM,RANK,IERR) CALL MPI_Comm_size(COMM,SIZE,IERR) dest=size-1 CALL MPI_Type_create_struct(nb, blklen, disp, types, type1, ierr) CALL MPI_Type_commit(type1, ierr) CALL MPI_Type_extent(type1, extent, ierr) CALL MPI_Type_contiguous(4, Type1, Type2, ierr) CALL MPI_Type_commit(Type2, ierr) CALL MPI_Type_extent(Type2, extent, ierr) DO k=1,17 IF(rank .EQ. 0) THEN ! send k copies of datatype Type1 CALL MPI_Send(a, k, Type1, dest, 0, comm, ierr) ELSE IF (rank == dest) THEN CALL MPI_Recv(a, 200, Type2, 0, 0, comm, status, ierr) CALL MPI_Get_elements(status, Type2, i, ierr) IF (i .NE. 2*k) THEN errs = errs+1 PRINT *, "k=",k," MPI_Get_elements returns", i, ", but it should be", 2*k END IF ELSE ! thix rank does not particupate END IF enddo CALL MPI_Type_free(type1, ierr) CALL MPI_Type_free(type2, ierr) CALL MPI_Finalize( ierr ) IF(rank .EQ. 0 .AND. errs .EQ. 0) THEN PRINT *, " No Errors" END IF END PROGRAM get_elem_u