diff --git a/m_compact.f90 b/m_compact.f90 index 9302cd6..4e83868 100644 --- a/m_compact.f90 +++ b/m_compact.f90 @@ -202,6 +202,10 @@ INTEGER :: i,j REAL*8 :: r1,r2,h1 + integer (kind=MPI_INTEGER_KIND) :: idx + integer (kind=MPI_INTEGER_KIND),dimension(2) :: requests + logical :: flagLow, flagUpp + h1=1./h r1=7./3. r2=1./12. @@ -209,70 +213,89 @@ !if (myid.eq.0) write(*,*) "parallel dfp commuication" if (myid.eq.master) then - call MPI_ISEND (x(1,1), 2*nd, MPI_REAL8, numprocs-1, myid, & - MPI_COMM_TASK, mpi_request, mpi_err) - - call MPI_RECV (xu, 2*nd, MPI_REAL8, myid+1, myid+1, & - MPI_COMM_TASK, mpi_status, mpi_err) - call MPI_ISEND (x(1,n-1), 2*nd, MPI_REAL8, myid+1, myid, & MPI_COMM_TASK, mpi_request, mpi_err) - call MPI_RECV (xl, 2*nd, MPI_REAL8, numprocs-1, numprocs-1, & - MPI_COMM_TASK, mpi_status, mpi_err) - - elseif (myid.eq.numprocs-1) then - - call MPI_ISEND (x(1,1), 2*nd, MPI_REAL8, myid-1, myid, & + call MPI_ISEND (x(1,1), 2*nd, MPI_REAL8, numprocs-1, myid, & MPI_COMM_TASK, mpi_request, mpi_err) - call MPI_RECV (xu, 2*nd, MPI_REAL8, 0, 0, & - MPI_COMM_TASK, mpi_status, mpi_err) + call MPI_IRECV (xl, 2*nd, MPI_REAL8, numprocs-1, numprocs-1, & + MPI_COMM_TASK, requests(1), mpi_err) + + call MPI_IRECV (xu, 2*nd, MPI_REAL8, myid+1, myid+1, & + MPI_COMM_TASK, requests(2), mpi_err) + + elseif (myid.eq.numprocs-1) then call MPI_ISEND (x(1,n-1), 2*nd, MPI_REAL8, 0, myid, & MPI_COMM_TASK, mpi_request, mpi_err) - call MPI_RECV (xl, 2*nd, MPI_REAL8, myid-1, myid-1, & - MPI_COMM_TASK, mpi_status, mpi_err) - - else - call MPI_ISEND (x(1,1), 2*nd, MPI_REAL8, myid-1, myid, & MPI_COMM_TASK, mpi_request, mpi_err) - call MPI_RECV (xu, 2*nd, MPI_REAL8, myid+1, myid+1, & - MPI_COMM_TASK, mpi_status, mpi_err) + call MPI_IRECV (xl, 2*nd, MPI_REAL8, myid-1, myid-1, & + MPI_COMM_TASK, requests(1), mpi_err) + + call MPI_IRECV (xu, 2*nd, MPI_REAL8, 0, 0, & + MPI_COMM_TASK, requests(2), mpi_err) + + else call MPI_ISEND (x(1,n-1), 2*nd, MPI_REAL8, myid+1, myid, & MPI_COMM_TASK, mpi_request, mpi_err) - call MPI_RECV (xl, 2*nd, MPI_REAL8, myid-1, myid-1, & - MPI_COMM_TASK, mpi_status, mpi_err) + call MPI_ISEND (x(1,1), 2*nd, MPI_REAL8, myid-1, myid, & + MPI_COMM_TASK, mpi_request, mpi_err) + + call MPI_IRECV (xl, 2*nd, MPI_REAL8, myid-1, myid-1, & + MPI_COMM_TASK, requests(1), mpi_err) + + call MPI_IRECV (xu, 2*nd, MPI_REAL8, myid+1, myid+1, & + MPI_COMM_TASK, requests(2), mpi_err) endif - DO j=1,nd - dx(j,1) =(r1*( x(j,2)-xl(j,2)) +r2*( x(j,3)-xl(j,1))) *h1 - ENDDO - - DO j=1,nd - dx(j,2) =(r1*( x(j,3)- x(j,1)) +r2*( x(j,4)-xl(j,2))) *h1 - ENDDO - - DO j=1,nd - dx(j,n-1)=(r1*( x(j,n)- x(j,n-2))+r2*(xu(j,1)- x(j,n-3)))*h1 - ENDDO - - DO j=1,nd - dx(j,n) =(r1*(xu(j,1)- x(j,n-1))+r2*(xu(j,2)- x(j,n-2)))*h1 - ENDDO - DO i=3,n-2 DO j=1,nd dx(j,i)=(r1*(x(j,i+1)-x(j,i-1))+r2*(x(j,i+2)-x(j,i-2)))*h1 ENDDO ENDDO + flagLow = .true. + flagUpp = .true. + + do while (flagLow.or.flagUpp) + + call MPI_WAITANY (2, requests, idx, mpi_status, mpi_err) + + !call MPI_WAIT (request1, mpi_status, mpi_err) + + if (idx.eq.1) then + DO j=1,nd + dx(j,1) =(r1*( x(j,2)-xl(j,2)) +r2*( x(j,3)-xl(j,1))) *h1 + ENDDO + + DO j=1,nd + dx(j,2) =(r1*( x(j,3)- x(j,1)) +r2*( x(j,4)-xl(j,2))) *h1 + ENDDO + + flagLow = .false. + endif + + !call MPI_WAIT (request2, mpi_status, mpi_err) + + if (idx.eq.2) then + DO j=1,nd + dx(j,n-1)=(r1*( x(j,n)- x(j,n-2))+r2*(xu(j,1)- x(j,n-3)))*h1 + ENDDO + + DO j=1,nd + dx(j,n) =(r1*(xu(j,1)- x(j,n-1))+r2*(xu(j,2)- x(j,n-2)))*h1 + ENDDO + + flagUpp = .false. + endif + enddo IF (dir.eq.1) CALL ctdslv(dx,vz1,zz1,nd,n,nall) ! x-direction IF (dir.eq.2) CALL ctdslv(dx,vz1,zz1,nd,n,nall) ! x-direction @@ -291,6 +314,10 @@ REAL*8,DIMENSION(nd,2) :: xu, xl + integer (kind=MPI_INTEGER_KIND) :: idx + integer (kind=MPI_INTEGER_KIND),dimension(2) :: requests + logical :: flagLow, flagUpp + h2=1./(h*h) r1=6. r2=3./8. @@ -298,81 +325,48 @@ !if (myid.eq.0) write(*,*) "parallel d2fp commuication" if (myid.eq.master) then - call MPI_ISEND (x(1,1), 2*nd, MPI_REAL8, numprocs-1, myid, & - MPI_COMM_TASK, mpi_request, mpi_err) - - call MPI_RECV (xu, 2*nd, MPI_REAL8, myid+1, myid+1, & - MPI_COMM_TASK, mpi_status, mpi_err) - call MPI_ISEND (x(1,n-1), 2*nd, MPI_REAL8, myid+1, myid, & MPI_COMM_TASK, mpi_request, mpi_err) - call MPI_RECV (xl, 2*nd, MPI_REAL8, numprocs-1, numprocs-1, & - MPI_COMM_TASK, mpi_status, mpi_err) - - elseif (myid.eq.numprocs-1) then - - call MPI_ISEND (x(1,1), 2*nd, MPI_REAL8, myid-1, myid, & + call MPI_ISEND (x(1,1), 2*nd, MPI_REAL8, numprocs-1, myid, & MPI_COMM_TASK, mpi_request, mpi_err) - call MPI_RECV (xu, 2*nd, MPI_REAL8, 0, 0, & - MPI_COMM_TASK, mpi_status, mpi_err) + call MPI_IRECV (xl, 2*nd, MPI_REAL8, numprocs-1, numprocs-1, & + MPI_COMM_TASK, requests(1), mpi_err) + + call MPI_IRECV (xu, 2*nd, MPI_REAL8, myid+1, myid+1, & + MPI_COMM_TASK, requests(2), mpi_err) + + elseif (myid.eq.numprocs-1) then call MPI_ISEND (x(1,n-1), 2*nd, MPI_REAL8, 0, myid, & MPI_COMM_TASK, mpi_request, mpi_err) - call MPI_RECV (xl, 2*nd, MPI_REAL8, myid-1, myid-1, & - MPI_COMM_TASK, mpi_status, mpi_err) - - else - call MPI_ISEND (x(1,1), 2*nd, MPI_REAL8, myid-1, myid, & MPI_COMM_TASK, mpi_request, mpi_err) - call MPI_RECV (xu, 2*nd, MPI_REAL8, myid+1, myid+1, & - MPI_COMM_TASK, mpi_status, mpi_err) + call MPI_IRECV (xl, 2*nd, MPI_REAL8, myid-1, myid-1, & + MPI_COMM_TASK, requests(1), mpi_err) + + call MPI_IRECV (xu, 2*nd, MPI_REAL8, 0, 0, & + MPI_COMM_TASK, requests(2), mpi_err) + + else call MPI_ISEND (x(1,n-1), 2*nd, MPI_REAL8, myid+1, myid, & MPI_COMM_TASK, mpi_request, mpi_err) - call MPI_RECV (xl, 2*nd, MPI_REAL8, myid-1, myid-1, & - MPI_COMM_TASK, mpi_status, mpi_err) + call MPI_ISEND (x(1,1), 2*nd, MPI_REAL8, myid-1, myid, & + MPI_COMM_TASK, mpi_request, mpi_err) + + call MPI_IRECV (xl, 2*nd, MPI_REAL8, myid-1, myid-1, & + MPI_COMM_TASK, requests(1), mpi_err) + + call MPI_IRECV (xu, 2*nd, MPI_REAL8, myid+1, myid+1, & + MPI_COMM_TASK, requests(2), mpi_err) endif - - DO j=1,nd - - t1 = (x(j,2)-2.*x(j,1)+xl(j,2)) - t2 = (x(j,3)-2.*x(j,1)+xl(j,1)) - dx(j,1)=(r1*t1+r2*t2)*h2 - - ENDDO - - DO j=1,nd - - t1 = (x(j,3)-2.*x(j,2)+ x(j,1)) - t2 = (x(j,4)-2.*x(j,2)+xl(j,2)) - dx(j,2)=(r1*t1+r2*t2)*h2 - - ENDDO - - DO j=1,nd - - t1 = ( x(j,n)-2.*x(j,n-1)+x(j,n-2)) - t2 = (xu(j,1)-2.*x(j,n-1)+x(j,n-3)) - dx(j,n-1)=(r1*t1+r2*t2)*h2 - - ENDDO - - DO j=1,nd - - t1 = (xu(j,1)-2.*x(j,n)+x(j,n-1)) - t2 = (xu(j,2)-2.*x(j,n)+x(j,n-2)) - dx(j,n)=(r1*t1+r2*t2)*h2 - - ENDDO - DO i=3,n-2 DO j=1,nd @@ -383,6 +377,61 @@ ENDDO ENDDO + + flagLow = .true. + flagUpp = .true. + + do while (flagLow.or.flagUpp) + + call MPI_WAITANY (2, requests, idx, mpi_status, mpi_err) + + !call MPI_WAIT (request1, mpi_status, mpi_err) + + if (idx.eq.1) then + + DO j=1,nd + + t1 = (x(j,2)-2.*x(j,1)+xl(j,2)) + t2 = (x(j,3)-2.*x(j,1)+xl(j,1)) + dx(j,1)=(r1*t1+r2*t2)*h2 + + ENDDO + + DO j=1,nd + + t1 = (x(j,3)-2.*x(j,2)+ x(j,1)) + t2 = (x(j,4)-2.*x(j,2)+xl(j,2)) + dx(j,2)=(r1*t1+r2*t2)*h2 + + ENDDO + + flagLow = .false. + endif + + !call MPI_WAIT (request2, mpi_status, mpi_err) + + if (idx.eq.2) then + + DO j=1,nd + + t1 = ( x(j,n)-2.*x(j,n-1)+x(j,n-2)) + t2 = (xu(j,1)-2.*x(j,n-1)+x(j,n-3)) + dx(j,n-1)=(r1*t1+r2*t2)*h2 + + ENDDO + + DO j=1,nd + + t1 = (xu(j,1)-2.*x(j,n)+x(j,n-1)) + t2 = (xu(j,2)-2.*x(j,n)+x(j,n-2)) + dx(j,n)=(r1*t1+r2*t2)*h2 + + ENDDO + + flagUpp = .false. + endif + enddo + IF (dir.eq.1) CALL ctdslv(dx,vz2,zz2,nd,n,nall) ! x-direction IF (dir.eq.2) CALL ctdslv(dx,vz2,zz2,nd,n,nall) ! y-direction IF (dir.eq.3) CALL ctdslv(dx,vz2,zz2,nd,n,nall) ! z-direction @@ -614,13 +663,12 @@ x1_ = x1_ + z(i)*r(:,i) enddo - ! call MPI_ALLREDUCE(x1_, x1, nd, MPI_REAL8, MPI_SUM, MPI_COMM_TASK, mpi_err) call MPI_REDUCE(x1_, x1, nd, MPI_REAL8, MPI_SUM, master, MPI_COMM_TASK, mpi_err) ! first process if (myid.eq.0) then - CALL MPI_ISEND(x1, nd, MPI_REAL8, np-1, 100, MPI_COMM_TASK, mpi_request, mpi_err) + CALL MPI_SSEND(x1, nd, MPI_REAL8, np-1, 100, MPI_COMM_TASK, mpi_err) r(:,1) = x1 r(:,2) = r(:,2) - x1 @@ -945,30 +993,22 @@ DO j=1,nd t1 = (x(j,n)-2.*x(j,n-1)+x(j,n-2)) t2 = (x(j,1)-2.*x(j,n-1)+x(j,n-3)) - IF (x(j,n).eq.x(j,n-1).and.x(j,n-1).eq.x(j,n-2)) t1=0. - IF (x(j,1).eq.x(j,n-1).and.x(j,n-1).eq.x(j,n-3)) t2=0. dx(j,n-1)=(r1*t1+r2*t2) t1 = (x(j,1)-2.*x(j,n)+x(j,n-1)) t2 = (x(j,2)-2.*x(j,n)+x(j,n-2)) - IF (x(j,1).eq.x(j,n).and.x(j,n).eq.x(j,n-1)) t1=0. - IF (x(j,2).eq.x(j,n).and.x(j,n).eq.x(j,n-2)) t2=0. ! dx(j,n)=(r1*(x(j,1)-2.*x(j,n)+x(j,n-1)) & ! +r2*(x(j,2)-2.*x(j,n)+x(j,n-2))) dx(j,n)=(r1*t1+r2*t2) t1 = (x(j,2)-2.*x(j,1)+x(j,n)) t2 = (x(j,3)-2.*x(j,1)+x(j,n-1)) - IF (x(j,2).eq.x(j,1).and.x(j,1).eq.x(j,n)) t1=0. - IF (x(j,3).eq.x(j,1).and.x(j,1).eq.x(j,n-1)) t2=0. ! dx(j,1)=(r1*(x(j,2)-2.*x(j,1)+x(j,n)) & ! +r2*(x(j,3)-2.*x(j,1)+x(j,n-1))) dx(j,1)=(r1*t1+r2*t2) t1 = (x(j,3)-2.*x(j,2)+x(j,1)) t2 = (x(j,4)-2.*x(j,2)+x(j,n)) - IF (x(j,3).eq.x(j,2).and.x(j,2).eq.x(j,1)) t1=0. - IF (x(j,4).eq.x(j,2).and.x(j,2).eq.x(j,n)) t2=0. ! dx(j,2)=(r1*(x(j,3)-2.*x(j,2)+x(j,1)) & ! +r2*(x(j,4)-2.*x(j,2)+x(j,n))) dx(j,2)=(r1*t1+r2*t2) @@ -982,8 +1022,6 @@ DO j=1,nd t1 = (x(j,i+1)-2.*x(j,i)+x(j,i-1)) t2 = (x(j,i+2)-2.*x(j,i)+x(j,i-2)) - IF (x(j,i+1).eq.x(j,i).and.x(j,i).eq.x(j,i-1)) t1=0. - IF (x(j,i+2).eq.x(j,i).and.x(j,i).eq.x(j,i-2)) t2=0. ! dx(j,i)=(r1*(x(j,i+1)-2.*x(j,i)+x(j,i-1)) & ! +r2*(x(j,i+2)-2.*x(j,i)+x(j,i-2))) dx(j,i)=(r1*t1+r2*t2) @@ -1059,30 +1097,22 @@ t1 = ( x(j,n)-2.*x(j,n-1)+x(j,n-2)) t2 = (xu(j,1)-2.*x(j,n-1)+x(j,n-3)) - IF ( x(j,n).eq.x(j,n-1).and.x(j,n-1).eq.x(j,n-2)) t1=0. - IF (xu(j,1).eq.x(j,n-1).and.x(j,n-1).eq.x(j,n-3)) t2=0. dx(j,n-1)=(r1*t1+r2*t2)*h2 t1 = (xu(j,1)-2.*x(j,n)+x(j,n-1)) t2 = (xu(j,2)-2.*x(j,n)+x(j,n-2)) - IF (xu(j,1).eq.x(j,n).and.x(j,n).eq.x(j,n-1)) t1=0. - IF (xu(j,2).eq.x(j,n).and.x(j,n).eq.x(j,n-2)) t2=0. ! dx(j,n)=(r1*(x(j,1)-2.*x(j,n)+x(j,n-1)) & ! +r2*(x(j,2)-2.*x(j,n)+x(j,n-2))) dx(j,n)=(r1*t1+r2*t2)*h2 t1 = (x(j,2)-2.*x(j,1)+xl(j,2)) t2 = (x(j,3)-2.*x(j,1)+xl(j,1)) - IF (x(j,2).eq.x(j,1).and.x(j,1).eq.xl(j,2)) t1=0. - IF (x(j,3).eq.x(j,1).and.x(j,1).eq.xl(j,1)) t2=0. ! dx(j,1)=(r1*(x(j,2)-2.*x(j,1)+x(j,n)) & ! +r2*(x(j,3)-2.*x(j,1)+x(j,n-1))) dx(j,1)=(r1*t1+r2*t2)*h2 t1 = (x(j,3)-2.*x(j,2)+ x(j,1)) t2 = (x(j,4)-2.*x(j,2)+xl(j,2)) - IF (x(j,3).eq.x(j,2).and.x(j,2).eq.x(j,1)) t1=0. - IF (x(j,4).eq.x(j,2).and.x(j,2).eq.xl(j,2)) t2=0. ! dx(j,2)=(r1*(x(j,3)-2.*x(j,2)+x(j,1)) & ! +r2*(x(j,4)-2.*x(j,2)+x(j,n))) dx(j,2)=(r1*t1+r2*t2)*h2 @@ -1094,8 +1124,6 @@ t1 = (x(j,i+1)-2.*x(j,i)+x(j,i-1)) t2 = (x(j,i+2)-2.*x(j,i)+x(j,i-2)) - IF (x(j,i+1).eq.x(j,i).and.x(j,i).eq.x(j,i-1)) t1=0. - IF (x(j,i+2).eq.x(j,i).and.x(j,i).eq.x(j,i-2)) t2=0. ! dx(j,i)=(r1*(x(j,i+1)-2.*x(j,i)+x(j,i-1)) & ! +r2*(x(j,i+2)-2.*x(j,i)+x(j,i-2))) dx(j,i)=(r1*t1+r2*t2)*h2 @@ -1152,10 +1180,6 @@ dx(j,2)=(x(j,3)-2.*x(j,2)+x(j,1)) dx(j,n-1)=(x(j,n)-2.*x(j,n-1)+x(j,n-2)) dx(j,n)=(a*x(j,n)+b*x(j,n-1)+c*x(j,n-2)+e*x(j,n-3)) - IF (x(j,1).eq.x(j,2).and.x(j,2).eq.x(j,3).and.x(j,3).eq.x(j,4)) dx(j,1)=0. - IF (x(j,3).eq.x(j,2).and.x(j,2).eq.x(j,1)) dx(j,2)=0. - IF (x(j,n).eq.x(j,n-1).and.x(j,n-1).eq.x(j,n-2).and.x(j,n-2).eq.x(j,n-3)) dx(j,n)=0. - IF (x(j,n).eq.x(j,n-1).and.x(j,n-1).eq.x(j,n-2)) dx(j,n-1)=0. dx(j,1)=dx(j,1)*h2 dx(j,2)=dx(j,2)*h2*r3 dx(j,n-1)=dx(j,n-1)*h2*r3 @@ -1165,8 +1189,6 @@ DO j=1,nd t1 = (x(j,i+1)-2.*x(j,i)+x(j,i-1)) t2 = (x(j,i+2)-2.*x(j,i)+x(j,i-2)) - IF (x(j,i+1).eq.x(j,i).and.x(j,i).eq.x(j,i-1)) t1=0. - IF (x(j,i+2).eq.x(j,i).and.x(j,i).eq.x(j,i-2)) t2=0. ! dx(j,i)=(r1*(x(j,i+1)-2.*x(j,i)+x(j,i-1)) & ! +r2*(x(j,i+2)-2.*x(j,i)+x(j,i-2)))