00001 program MPI_wrapper
00002 implicit none
00003 include 'param.f90'
00004 integer i,j,k,narr(nz_ghostglobal),kk_send(nz_max)
00005
00006 call mpi_init(ierr)
00007
00008
00009
00010
00011
00012 call mpi_comm_size (MPI_COMM_WORLD, nprocs, ierr)
00013 call mpi_comm_rank (MPI_COMM_WORLD, my_rank, ierr)
00014 istop=.false.
00015 isbottom=.false.
00016
00017 if(my_rank .eq.0) isbottom=.true.
00018 if(my_rank .eq. nprocs-1) istop=.true.
00019
00020 do k=1,nz_ghostglobal
00021 narr(k)=k
00022 enddo
00023
00024
00025
00026 dn=nz_global/(nprocs)
00027
00028 do i=1,nprocs
00029 start(i)=(i-1)*dn+1+2
00030 ends(i)=(i)*dn+2
00031 enddo
00032 start(1)=3
00033 ends(nprocs)=nz_global+2
00034
00035
00036
00037 if(my_rank .eq. 0) then
00038 nz=(ends(1)-start(1)+1)+4
00039 kk(1:ends(1)-start(1)+5)=narr(start(1)-2:ends(1)+2)
00040 if(nprocs .gt. 1) then
00041 do i=1,nprocs-1
00042 itemp=(ends(i+1)-start(i+1)+1)+4
00043 call mpi_send(itemp,1,MPI_INTEGER, i,1,MPI_COMM_WORLD, ierr)
00044 kk_send=0
00045
00046 kk_send(1:ends(i+1)-start(i+1)+5)=narr(start(i+1)-2:ends(i+1)+2)
00047 call mpi_send(kk_send,nz_max,MPI_INTEGER, i,1,MPI_COMM_WORLD, ierr)
00048 enddo
00049 endif
00050 endif
00051 if(my_rank .ne. 0) then
00052 call mpi_recv(nz,1,MPI_INTEGER, 0,1,MPI_COMM_WORLD,istatus,ierr)
00053 call mpi_recv(kk,nz_max,MPI_INTEGER, 0,1,MPI_COMM_WORLD,istatus,ierr)
00054 endif
00055 if (my_rank .eq. nprocs-1) nz=nz
00056 do i=1,nx
00057 do j=1,ny
00058 zz(i,j,:)=6.959e10-(1000.-kk)*dz
00059 enddo
00060 enddo
00061
00062 call wave()
00063 call mpi_finalize(ierr)
00064 endprogram MPI_wrapper
00065