! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE MPMAX0i ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE mpmax0i(amax,amin) 3 IMPLICIT NONE !----------------------------------------------------------------------- ! ! Get global maximum and minimux for Integer scalars. ! !----------------------------------------------------------------------- INTEGER, INTENT(INOUT) :: amax,amin INTEGER :: imstat INTEGER :: maxtm, mintm INCLUDE 'mpif.h' !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! start of executable code.... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ !----------------------------------------------------------------------- ! ! Get maximum from all processors ! !----------------------------------------------------------------------- ! CALL mpi_allreduce (amax, maxtm, 1, MPI_REAL, MPI_MAX, ! : MPI_COMM_WORLD, imstat) ! commented out because the T3E ! has trouble with mpi_allreduce CALL mpi_reduce(amax,maxtm,1,MPI_INTEGER,MPI_MAX,0, & MPI_COMM_WORLD,imstat) CALL mpi_bcast(maxtm,1,MPI_INTEGER,0,MPI_COMM_WORLD,imstat) amax = maxtm !----------------------------------------------------------------------- ! ! Get minimum from all processors ! !----------------------------------------------------------------------- ! CALL mpi_allreduce (amin, mintm, 1, MPI_REAL, MPI_MIN, ! : MPI_COMM_WORLD, imstat) ! commented out because the T3E ! has trouble with mpi_allreduce CALL mpi_reduce(amin,mintm,1,MPI_INTEGER,MPI_MIN,0, & MPI_COMM_WORLD,imstat) CALL mpi_bcast(mintm,1,MPI_INTEGER,0,MPI_COMM_WORLD,imstat) amin = mintm RETURN END SUBROUTINE mpmax0i ! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE MPBCASTI ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE mpbcasti(var,source) 2 ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Broadcast a integer value from source processor to all other processes. ! !----------------------------------------------------------------------- ! ! ! AUTHOR: Yunheng Wang ! 2005/04/18 ! ! MODIFICATION HISTORY: ! !----------------------------------------------------------------------- ! ! INPUT/OUTPUT : ! ! var Integer value to broadcast ! source source processor rank ! !----------------------------------------------------------------------- ! ! Variable declarations. ! !----------------------------------------------------------------------- IMPLICIT NONE INTEGER, INTENT(IN) :: source INTEGER, INTENT(IN) :: var !----------------------------------------------------------------------- ! ! Include files. ! !----------------------------------------------------------------------- INCLUDE 'mpif.h' INCLUDE 'mp.inc' !----------------------------------------------------------------------- ! ! Local variable declarations. ! !----------------------------------------------------------------------- INTEGER :: imstat !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ CALl mpi_bcast(var,1,MPI_INTEGER,source,MPI_COMM_WORLD,imstat) IF (imstat /= 0) THEN WRITE (6,*) "MPBCASTI: error on processor",myproc END IF RETURN END SUBROUTINE mpbcasti ! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE globalpbar ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE globalpbar(pbarmax,ini,inj,klvl,zpc,nx,ny,nz,zpcmax) 1,4 !----------------------------------------------------------------------- ! ! Find global maximum pbarmax and its index, ini, inj ! and extract the zpc value from a 3d array at that location ! !----------------------------------------------------------------------- IMPLICIT NONE REAL, INTENT(INOUT) :: pbarmax INTEGER, INTENT(INOUT) :: ini INTEGER, INTENT(INOUT) :: inj INTEGER, INTENT(IN) :: klvl INTEGER, INTENT(IN) :: nx,ny,nz REAL, INTENT(IN) :: zpc(nx,ny,nz) REAL, INTENT(OUT) :: zpcmax INCLUDE 'mpif.h' INCLUDE 'mp.inc' REAL :: maxarr(2), maxtm(2) INTEGER :: maxsrc INTEGER :: imstat !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Begin of executable code below ... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ CALL inctag maxtm(1) = 0.0 maxtm(2) = 0.0 maxarr(1) = pbarmax maxarr(2) = FLOAT(myproc) ! should call mpi_allreduce, however, since T3E has trouble with this ! call, we use two calls below to substitute it. CALL mpi_reduce(maxarr,maxtm,1,MPI_2REAL,MPI_MAXLOC,0, & MPI_COMM_WORLD,imstat) CALL mpi_bcast (maxtm,1,MPI_2REAL,0,MPI_COMM_WORLD,imstat) pbarmax = maxtm(1) maxsrc = NINT(maxtm(2)) IF (myproc == maxsrc) THEN ! only processor maxsrc contains what we want. IF (ini /= 0 .AND. inj /= 0) THEN zpcmax = zpc(ini,inj,klvl) ELSE zpcmax = -9999.0 ! missing value, will not be used END IF END IF CALL mpbcasti(ini,maxsrc) CALL mpbcasti(inj,maxsrc) CALL mpbcastr(zpcmax,maxsrc) RETURN END SUBROUTINE globalpbar