#ifdef SHMEM subroutine gisum(aaa,nnn,bb1) #else subroutine gisum(aaa,nnn,bbb) #endif c c*********************************************************************** c c dl_poly global summation subroutine for hypercube - MPI version c integer version c c copyright - daresbury laboratory 1992 c author - w. smith march 1992. c MPI version - t.forester may 1995 c CPP version - w.smith may 1995 c c $Author: psh $ c $Date: 1998-11-26 12:09:39 +0100 (Thu, 26. Nov 1998) $ c $Revision: 997 $ c $State$ c c*********************************************************************** c implicit real*8 (a-h,o-z) include 'dl_params.inc' #include "comms.inc" #ifdef SHMEM integer aaa(nnn),bb1(nnn) integer barrier integer bbb common/shared/bbb(mxbuff) #else integer aaa(nnn),bbb(nnn) #endif #ifdef MPI integer status(MPI_STATUS_SIZE) #ifdef MPIU #define MPI_allreduce MPI_allreduce_ #endif call MPI_allreduce(aaa,bbb,nnn,MPI_INTEGER, x MPI_SUM,MPI_COMM_WORLD,ierror) do i = 1,nnn aaa(i) = bbb(i) enddo #else #ifndef SERIAL c c identify node iii=mynode() c c pass data to neighbouring nodes kk=1 call gsync() do k=1,nodedim() k0=iii/kk-2*(iii/(2*kk)) if(k0.eq.0)then k1=kk+iii #ifdef INTEL msg1=irecv(Igsum_tag1+k,bbb,Ilen*nnn) call csend(Igsum_tag2+k,aaa,Ilen*nnn,k1,0) call msgwait(msg1) #endif #ifdef PVM call csend(Igsum_tag1+k,aaa,Ilen*nnn,k1,0) call crecv(Igsum_tag2+k,bbb,Ilen*nnn) #endif #if SHMEM ibar=barrier() call shmem_put(bbb, aaa, nnn, k1) call shmem_udcflush() ibar=barrier() #endif c c add data received to local array do i=1,nnn aaa(i)=aaa(i)+bbb(i) enddo else k2=iii-kk #ifdef INTEL msg2=irecv(Igsum_tag2+k,bbb,Ilen*nnn) call csend(Igsum_tag1+k,aaa,Ilen*nnn,k2,0) call msgwait(msg2) #endif #ifdef PVM call csend(Igsum_tag2+k,aaa,Ilen*nnn,k2,0) call crecv(Igsum_tag1+k,bbb,Ilen*nnn) #endif #if SHMEM ibar=barrier() call shmem_put(bbb, aaa, nnn, k2) call shmem_udcflush() ibar=barrier() #endif c c add data received to local array do i=1,nnn aaa(i)=bbb(i)+aaa(i) enddo endif kk=2*kk enddo #endif #endif return end