Hello, <br><br>  I am trying to define MPI derived data type to simplify my program.<br>  <br>  But I can not get it working properly.<br><br>  First I describe the basic thing about the following test program.<br><br>  There are many layers consisting by many nodes. Each node has a position(x,y,z) ( real data type )and a bound condition  type description in (x,y,z) direction( integer data) .<br>
<br>  I want to send i-th layer node data in a so-called buffer space to j-th layer node in a so-called computation space.<br><br>  I first define two MPI derived data types to describing node layer data. And then using the new data type to exchange data between the two space.<br>
<br>  The following is my FORTRAN code, though it can be compiled and run , the result is wrong.<br><br>  Can anyone help me  out? <br><br><br>  Thank you .<br><br>JILONG YIN<br><br> 2010-05-07<br><br>[CODE]<br><br>C The following program is used to test MPI derived data type in parallel finite element program<br>
C The node data in buffer space will be send to computation space<br>      PROGRAM TEST<br><br>    IMPLICIT NONE<br><br>    INCLUDE &#39;MPIF.H&#39;<br><br>C The number of nodes on a crossection<br>      INTEGER,PARAMETER::N_NOD_CROSEC=10<br>
C The number of nodes along the longitude direction<br>    INTEGER,PARAMETER::N_NOD_STREAM=13<br>C The number of total nodes<br>    INTEGER,PARAMETER::N_NOD=N_NOD_CROSEC*N_NOD_STREAM<br><br>C Derived data type for node layer data buffer space<br>
    INTEGER NOD_LAY_DATA_BF(N_NOD_STREAM)<br>C The node position data  in buffer space<br>    DOUBLE PRECISION POSITION_BF(3,N_NOD)<br>C The node boundary condition type data in buffer space<br>    INTEGER IFLAG_BD_COND_BF(3,N_NOD)<br>
<br>C Derived data type for node layer data computation space<br>    INTEGER NOD_LAY_DATA(N_NOD_STREAM)<br>C The node position data  in computation space<br>    DOUBLE PRECISION POSITION(3,N_NOD)<br>C The node boundary condition type data in computation space<br>
    INTEGER IFLAG_BD_COND(3,N_NOD)<br><br>C Some varibles for defining MPI derived data type<br>    INTEGER IBLOCK(99),IDISP(99),ITYPE(99)<br>    INTEGER NBLOCK<br><br>C Node data type(for buffer space and computation space)<br>
      INTEGER NOD_LAY_DATA_BF_TYPE<br>      INTEGER NOD_LAY_DATA_TYPE<br><br>C MPI function status return <br>    INTEGER::ISTATUS(MPI_STATUS_SIZE),IERR<br>C My rank <br>    INTEGER MYID<br><br>C source rank and destination rank ID<br>
    INTEGER ID_SRC,ID_DEST<br>C node layer number for sending and receiving<br>    INTEGER ISNS,IRNS<br><br>    INTEGER I,J,NOD1,NOD2<br><br>C Initilize the MPI enviroment<br>    CALL MPI_INIT(IERR)<br><br>C Get the rank ID<br>
      CALL MPI_COMM_RANK(MPI_COMM_WORLD,MYID,IERR)<br><br>C----------------------------------------------------------<br>C Define node layer derived data type for buffer space<br>      NBLOCK=0<br><br>      NBLOCK=NBLOCK+1<br>
    IBLOCK(NBLOCK)=1<br>    ITYPE(NBLOCK)=MPI_INTEGER<br>    CALL MPI_ADDRESS(NOD_LAY_DATA_BF,IDISP(NBLOCK),IERR)<br><br>C Node position<br>      NBLOCK=NBLOCK+1<br>    IBLOCK(NBLOCK)=3*N_NOD_CROSEC<br>    ITYPE(NBLOCK)=MPI_DOUBLE_PRECISION<br>
    CALL MPI_ADDRESS(POSITION_BF,IDISP(NBLOCK),IERR)<br><br>C Node boundary condition type<br>      NBLOCK=NBLOCK+1<br>    IBLOCK(NBLOCK)=3*N_NOD_CROSEC<br>    ITYPE(NBLOCK)=MPI_INTEGER<br>    CALL MPI_ADDRESS(IFLAG_BD_COND_BF,IDISP(NBLOCK),IERR)<br>
<br>C convert to relative address<br>    DO I=NBLOCK,1,-1<br>      IDISP(I)=IDISP(I)-IDISP(1)<br>    END DO<br><br>C generate new derived data type<br>    CALL MPI_TYPE_STRUCT(NBLOCK,IBLOCK,IDISP,ITYPE,<br>     &amp;                     NOD_LAY_DATA_BF_TYPE,IERR)     <br>
      CALL MPI_TYPE_COMMIT(NOD_LAY_DATA_BF_TYPE,IERR)     <br><br>C---------------------------------------------------------      <br>C Define node layer derived data type for computation space<br>C <br>      NBLOCK=0<br>
<br>      NBLOCK=NBLOCK+1<br>    IBLOCK(NBLOCK)=1<br>    ITYPE(NBLOCK)=MPI_INTEGER<br>    CALL MPI_ADDRESS(NOD_LAY_DATA,IDISP(NBLOCK),IERR)<br><br>C Node position<br>      NBLOCK=NBLOCK+1<br>    IBLOCK(NBLOCK)=3*N_NOD_CROSEC<br>
    ITYPE(NBLOCK)=MPI_DOUBLE_PRECISION<br>    CALL MPI_ADDRESS(POSITION,IDISP(NBLOCK),IERR)<br><br>C Node boundary condition type<br>      NBLOCK=NBLOCK+1<br>    IBLOCK(NBLOCK)=3*N_NOD_CROSEC<br>    ITYPE(NBLOCK)=MPI_INTEGER<br>
    CALL MPI_ADDRESS(IFLAG_BD_COND(1,1),IDISP(NBLOCK),IERR)<br><br>C convert to relative address<br>    DO I=NBLOCK,1,-1<br>      IDISP(I)=IDISP(I)-IDISP(1)<br>    END DO<br><br>C generate new derived data type<br>    CALL MPI_TYPE_STRUCT(NBLOCK,IBLOCK,IDISP,ITYPE,<br>
     &amp;                     NOD_LAY_DATA_TYPE,IERR)     <br>      CALL MPI_TYPE_COMMIT(NOD_LAY_DATA_TYPE,IERR)     <br><br><br>CC---------------------------------------------------------<br>C Node data initilize for computation space<br>
<br>      NOD_LAY_DATA(:)=0<br>    POSITION(:,:)=0.0D0<br>    IFLAG_BD_COND(:,:)=-1<br><br>C Prepare test data for buffer space<br>      DO I=1,N_NOD_STREAM<br>      NOD_LAY_DATA_BF(I)=I<br>    END DO<br><br>      DO I=1,N_NOD<br>
      DO J=1,3<br>        POSITION_BF(J,I)=J+I*10.0D0<br>          IFLAG_BD_COND_BF(J,I)=J+I*10+90000000<br>      END DO<br>    END DO<br><br>C I will send the ISNS-th layer node data in buffer space to IRNS-th layer node data in computation space<br>
    ISNS=1<br>    IRNS=2<br><br>C This is the source rank id and destination rank id<br>    ID_SRC=0<br>    ID_DEST=1<br><br>C send node layer data using derived data type 1     <br>    IF(MYID.EQ.ID_SRC) THEN<br>        CALL MPI_SEND(NOD_LAY_DATA_BF(ISNS),1,NOD_LAY_DATA_BF_TYPE,<br>
     &amp;                ID_DEST,123,MPI_COMM_WORLD,IERR)<br><br>    END IF<br><br><br>C receive node layer data using derived data type 2<br>    IF(MYID.EQ.ID_DEST) THEN<br>          CALL MPI_RECV(NOD_LAY_DATA(IRNS),1,NOD_LAY_DATA_TYPE,<br>
     &amp;                  ID_SRC,123,MPI_COMM_WORLD,ISTATUS,IERR)<br>    END IF<br><br>    print*,&#39;Myid=&#39;,MYID,&#39;IERR=&#39;,ierr<br><br>C output the received data to verify them<br>      IF(MYID.EQ.ID_DEST) THEN<br>
<br>    PRINT*,ID_SRC,NOD_LAY_DATA_BF(ISNS),<br>     &amp;       ID_DEST,NOD_LAY_DATA(IRNS)<br>          <br>    DO I=1,N_NOD_CROSEC<br>      NOD1=I+(ISNS-1)*N_NOD_CROSEC<br>      NOD2=I+(IRNS-1)*N_NOD_CROSEC<br><br>      PRINT*,NOD1,POSITION_BF(1,NOD1),NOD2,POSITION(1,NOD2)<br>
      PRINT*,NOD1,POSITION_BF(2,NOD1),NOD2,POSITION(2,NOD2)<br>      PRINT*,NOD1,POSITION_BF(3,NOD1),NOD2,POSITION(3,NOD2)<br><br>    PRINT*,NOD1,IFLAG_BD_COND_BF(1,NOD1),NOD2,IFLAG_BD_COND(1,NOD2)<br>    PRINT*,NOD1,IFLAG_BD_COND_BF(2,NOD1),NOD2,IFLAG_BD_COND(2,NOD2)<br>
    PRINT*,NOD1,IFLAG_BD_COND_BF(3,NOD1),NOD2,IFLAG_BD_COND(3,NOD2)<br><br>    END DO<br><br>    END IF<br><br><br>c <br>      CALL MPI_TYPE_FREE(NOD_LAY_DATA_BF_TYPE,IERR)      <br>      CALL MPI_TYPE_FREE(NOD_LAY_DATA_TYPE,IERR)      <br>
      <br>    CALL MPI_FINALIZE(IERR)<br><br><br>    END<br><br><br><br>[/CODE]<br><br><br><br><br><br>