program ringtopo include 'mpif.h' integer numtasks, rank, next, prev, buf(2), tag1, tag2, ierr integer stats(MPI_STATUS_SIZE,2), reqs(2),reqs1(2) integer,parameter::buf_size=130 real CRXi(10000),CP_sendx(buf_size) real CP_S6(6,buf_size),CP_R6(6,buf_size),xi(100000) real yi(100000),zi(100000),ui(100000),vi(100000),wi(100000) real CP_sendy(buf_size),CP_sendz(buf_size),CP_sendu(buf_size) real CP_sendv(buf_size),CP_sendw(buf_size) real CRYi(10000), CRZi(10000), CRUi(10000), CRVi(10000) real CRwi(10000) integer CP_send,CP_recv,ionsR,Max_p,n_p,LABEL_p,ions,loop tag1 = 1 tag2 = 2 do loop=1,2 ions=5000 do i=1,10000 CRxi(i)=i*1.0 CRyi(i)=i*2.0 CRzi(i)=i*3.0 CRui(i)=i*4.0 CRvi(i)=i*5.0 CRwi(i)=i*6.0 end do call MPI_INIT(ierr) call MPI_COMM_RANK(MPI_COMM_WORLD, rank, ierr) call MPI_COMM_SIZE(MPI_COMM_WORLD, numtasks, ierr) prev = rank - 1 next = rank + 1 if (rank .eq. 0) then prev = numtasks - 1 endif if (rank .eq. numtasks - 1) then next = 0 endif ionsR=1120 C do some work Max_p=ionsR/buf_size+1 LABEL_p=0 CP_recv=20 print*,CP_recv,Max_p,35335 do 200 n_p=1,Max_p CP_send=0 do i=1,buf_size n=LABEL_p+i C CP_S6(1,i)=CRXi(n) CP_sendx(i)=CRXi(n) CP_sendy(i)=CRyi(n) CP_sendz(i)=CRzi(n) CP_sendu(i)=CRui(n) CP_sendv(i)=CRvi(n) CP_sendw(i)=CRwi(n) end do CP_send=buf_size if(n.gt.ionsR)then CP_send=ionsR - LABEL_p if (CP_send.lt.0) CP_send=-CP_send end if LABEL_p=n do i=1,buf_size CP_S6(1,i)=CP_sendx(i) CP_S6(2,i)=CP_sendy(i) CP_S6(3,i)=CP_sendz(i) CP_S6(4,i)=CP_sendu(i) CP_S6(5,i)=CP_sendv(i) CP_S6(6,i)=CP_sendw(i) end do C print*,mreal,mint,lgrp,CP_send,reqs,1111114 C print*,rank,MPI_INTEGER,CP_recv,CP_send,11111113 C print*,rank,MPI_INTEGER,CP_R6(6,10),CP_s6(6,10),11111113 print*,loop call MPI_IRECV(CP_recv, 1, MPI_INTEGER, prev, tag1, & MPI_COMM_WORLD, reqs(1), ierr) call MPI_ISEND(CP_send, 1, MPI_INTEGER, next, tag1, & MPI_COMM_WORLD, reqs(2), ierr) call MPI_WAITALL(2, reqs, stats, ierr); call MPI_IRECV(CP_R6, 6*CP_recv, MPI_REAL, prev, tag2, & MPI_COMM_WORLD, reqs1(1), ierr) call MPI_ISEND(CP_S6, 6*CP_send, MPI_REAL, next, tag2, & MPI_COMM_WORLD, reqs1(2), ierr) C call MPI_WAITALL(2, reqs1, stats, ierr); print*,rank,LABEL_p,CP_R6(6,10),CP_s6(6,10),11111114 if (CP_recv.gt.0) then do n=1,CP_recv ions=ions+1 xi(ions)=CP_R6(1,n) yi(ions)=CP_R6(2,n) zi(ions)=CP_R6(3,n) ui(ions)=CP_R6(4,n) vi(ions)=CP_R6(5,n) wi(ions)=CP_R6(6,n) end do else print*,n_p,777777771,888888881 End if C110 continue C....................... 200 continue end do call MPI_FINALIZE(ierr) end