- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Dear all,
this is becoming a nightmare. I have the following program, where i create MPI_TYPE_CREATE_STRUCT and then I try to send it to other processor. It crushes every-time and do not know why.
Could someone please help me?
PROGRAM PROVA_STRUCT
IMPLICIT NONE
INCLUDE 'mpif.h'
!
TYPE tMPI
INTEGER :: myrank, nCPU, iErr, status
INTEGER :: AUTO_REAL
INTEGER :: iStart, iEnd, jStart, jEnd
INTEGER :: imax, jmax
INTEGER :: npt
INTEGER :: nmcx,nmcy
REAL :: x1L,x2L,y1L,y2L
REAL :: err
INTEGER, ALLOCATABLE :: mycoords(:), info(:)
END TYPE tMPI
!
type particle
integer :: rx
real :: QQ
end type particle
!
TYPE(tMPI) :: MPI
INTEGER :: COMM_CART
INTEGER :: MPI_PARTICLE_TYPE
INTEGER,ALLOCATABLE :: DIMS(:)
LOGICAL,ALLOCATABLE :: PERIODS(:)
INTEGER :: RCPU,LCPU,BCPU,TCPU,RTCPU,RBCPU,LTCPU,LBCPU
INTEGER :: source
INTEGER :: ndims
INTEGER :: nstruct
INTEGER :: x_thread,y_thread
INTEGER,ALLOCATABLE :: TYPES(:)
INTEGER,ALLOCATABLE :: LENGTHS(:)
INTEGER,ALLOCATABLE :: DISPLACEMENTS(:)
INTEGER :: npt,ip
type(particle) :: dummy ! Used for calculation of displacement
TYPE(particle),ALLOCATABLE :: P_SEND(:),P_RECV(:)
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)
!
ndims=2
!
x_thread = MPI%nCPU/ndims
y_thread = x_thread
!
ALLOCATE ( dims(ndims), periods(ndims), MPI%mycoords(ndims) )
dims = [x_thread, y_thread]
periods = .FALSE.
CALL MPI_CART_CREATE (MPI_COMM_WORLD,ndims,dims,periods,.TRUE.,COMM_CART,MPI%iErr)
CALL MPI_COMM_RANK(COMM_CART,MPI%myrank,MPI%iErr)
!Find neighbors
CALL MPI_CART_SHIFT(COMM_CART,0,1,source,RCPU,MPI%iErr) ! x-dir, right
CALL MPI_CART_SHIFT(COMM_CART,0,-1,source,LCPU,MPI%iErr) ! x-dir, left
CALL MPI_CART_SHIFT(COMM_CART,1,1,source,TCPU,MPI%iErr) ! y-dir, top
CALL MPI_CART_SHIFT(COMM_CART,1,-1,source,BCPU,MPI%iErr) ! y-dir, bottom
nstruct=2
ALLOCATE(TYPES(nstruct))
ALLOCATE(LENGTHS(nstruct))
ALLOCATE(DISPLACEMENTS(nstruct))
!
TYPES(1)=MPI_INTEGER
TYPES(2)=MPI_DOUBLE_PRECISION
!
LENGTHS(1)=1
LENGTHS(2)=1
!
DISPLACEMENTS(1)=0
DISPLACEMENTS(2)=sizeof(dummy%rx)
CALL MPI_TYPE_CREATE_STRUCT(nstruct,lengths,displacements,types,mpi_particle_type,MPI%iErr)
CALL MPI_TYPE_COMMIT(mpi_particle_type,MPI%iErr)
!
NPT=10
ALLOCATE(P_SEND(NPT))
ALLOCATE(P_RECV(NPT))
DO ip=1,NPT
P_SEND(ip)%rx=1
P_SEND(ip)%QQ=11.
P_RECV(ip)%rx=0
P_RECV(ip)%QQ=0.
ENDDO
CALL MPI_BARRIER(MPI_COMM_WORLD,MPI%iErr)
CALL MPI_Sendrecv(P_SEND(:),10,MPI_PARTICLE_TYPE,BCPU,201,&
P_RECV(:),10,MPI_PARTICLE_TYPE,TCPU,201,MPI_COMM_WORLD,MPI_STATUS_IGNORE,MPI%iErr)
CALL MPI_FINALIZE(MPI%iErr)
ENDPROGRAM
I think that this one is a very simple program, that can be useful for me to understand where I do not understand.
Thanks a lot
Link Copied
0 Replies
Reply
Topic Options
- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Printer Friendly Page