Diego, my bad, i should have passed displacements(1) to MPI_Type_create_struct
here is an updated version (note you have to use a REQUEST integer for MPI_Isend and MPI_Irecv, and you also have to call MPI_Wait to ensure the requests complete) Cheers, Gilles On 2015/01/08 8:23, Diego Avesani wrote: > Dear Gilles, Dear all, > > I'm sorry to bother you again, but I have some problem with send and > receive the struct_data. > > I tried to send a MPI_Type_Create_Struct but I get a segmentation fault > occurred and I do not know why. The program is very simple, it is the old > one with the isend and irecv subroutines > > (you can find it in the attachment) > > Thanks again > > > Diego > > > On 5 January 2015 at 15:54, Diego Avesani <diego.aves...@gmail.com> wrote: > >> Dear Gilles, >> >> Thanks, Thanks a lot. >> Now is more clear. >> >> Again, thanks a lot >> >> Diego >> >> > > > _______________________________________________ > users mailing list > us...@open-mpi.org > Subscription: http://www.open-mpi.org/mailman/listinfo.cgi/users > Link to this post: > http://www.open-mpi.org/community/lists/users/2015/01/26116.php
MODULE MOD_PRECISION integer, parameter :: dp = selected_real_kind(p=16) ENDMODULE PROGRAM PROVA_STRUCT USE MOD_PRECISION IMPLICIT NONE INCLUDE 'mpif.h' ! TYPE tMPI INTEGER :: myrank, nCPU, iErr, status END TYPE tMPI ! type particle sequence integer :: ip real(dp) :: rp(2) real(dp) :: QQ(4) end type particle ! TYPE(tMPI) :: MPI INTEGER :: COMM_CART INTEGER :: MPI_PARTICLE_TYPE_OLD INTEGER :: MPI_PARTICLE_TYPE INTEGER :: nstruct INTEGER,ALLOCATABLE :: TYPES(:) INTEGER,ALLOCATABLE :: LENGTHS(:) INTEGER :: REQUEST(2) INTEGER(MPI_ADDRESS_KIND),ALLOCATABLE,DIMENSION(:) ::DISPLACEMENTS type(particle) :: dummy(2) ! Used for calculation of displacement CALL MPI_INIT(MPI%iErr) CALL MPI_COMM_RANK(MPI_COMM_WORLD, MPI%myrank, MPI%iErr) CALL MPI_COMM_SIZE(MPI_COMM_WORLD, MPI%nCPU, MPI%iErr) ! ! nstruct=3 ALLOCATE(TYPES(nstruct)) ALLOCATE(LENGTHS(nstruct)) ALLOCATE(DISPLACEMENTS(0:nstruct+1)) ! TYPES(1)=MPI_INTEGER TYPES(2)=MPI_DOUBLE_PRECISION TYPES(3)=MPI_DOUBLE_PRECISION ! LENGTHS(1)=1 LENGTHS(2)=2 LENGTHS(3)=4 ! ! CALL MPI_GET_ADDRESS(dummy(1),DISPLACEMENTS(0),MPI%iErr) CALL MPI_GET_ADDRESS(dummy(1)%ip,DISPLACEMENTS(1),MPI%iErr) CALL MPI_GET_ADDRESS(dummy(1)%RP(1),DISPLACEMENTS(2),MPI%iErr) CALL MPI_GET_ADDRESS(dummy(1)%QQ(1),DISPLACEMENTS(3),MPI%iErr) CALL MPI_GET_ADDRESS(dummy(2),DISPLACEMENTS(4),MPI%iErr) ! DISPLACEMENTS(1:nstruct+1)= DISPLACEMENTS(1:nstruct+1)-DISPLACEMENTS(0) ! CALL MPI_TYPE_CREATE_STRUCT(nstruct,lengths,displacements(1),types,MPI_PARTICLE_TYPE_OLD,MPI%iErr) CALL MPI_TYPE_COMMIT(MPI_PARTICLE_TYPE_OLD,MPI%iErr) ! ! CALL MPI_TYPE_CREATE_RESIZED(MPI_PARTICLE_TYPE_OLD, DISPLACEMENTS(1), DISPLACEMENTS(4), MPI_PARTICLE_TYPE, MPI%iErr) CALL MPI_TYPE_COMMIT(MPI_PARTICLE_TYPE,MPI%iErr) ! IF(MPI%myrank==0)THEN WRITE(*,*) DISPLACEMENTS ENDIF ! IF(MPI%myrank==0)THEN CALL MPI_ISEND(DUMMY(1),1,MPI_PARTICLE_TYPE,1,0,MPI_COMM_WORLD,REQUEST,MPI%iErr) ENDIF ! IF(MPI%myrank==1)THEN CALL MPI_IRECV(DUMMY(1),1,MPI_PARTICLE_TYPE,0,0,MPI_COMM_WORLD,REQUEST,MPI%iErr) ENDIF CALL MPI_WAIT(REQUEST, MPI_STATUS_IGNORE) ! CALL MPI_Finalize(MPI%iErr) ! ENDPROGRAM