remove unnecessary ifs and optimize parallel td solve

This commit is contained in:
ignis 2017-11-09 03:11:09 +09:00
parent 75f0feaa02
commit 6933297130

View file

@ -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)))