C $Header: /u/gcmpack/MITgcm/pkg/monitor/mon_stats_latbnd_rl.F,v 1.8 2009/04/28 18:16:53 jmc Exp $ C $Name: $ #include "MONITOR_OPTIONS.h" C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----| CBOP C !ROUTINE: MON_STATS_LATBND_RL C !INTERFACE: SUBROUTINE MON_STATS_LATBND_RL( I myNr, mskNr, kLoc, nSepBnd, ySepBnd, I arr, arrMask, arrhFac, arrArea, arrY, arrDr, O theMin,theMax,theMean,theVar,theVol, I myThid ) C !DESCRIPTION: C Calculate bare statistics of global array "\_RL arr" on each C Latitude band (given by \texttt{ySepBnd}). C !USES: IMPLICIT NONE #include "SIZE.h" #include "EEPARAMS.h" INTEGER NLATBND EXTERNAL C !INPUT PARAMETERS: C nSepBnd :: Number of latitude bands C ySepBnd :: Southern latitude egde (from 2 to nSepBnd, 1 is not used) INTEGER myNr, mskNr, kLoc INTEGER nSepBnd _RS ySepBnd(nSepBnd) _RL arr(1-OLx:sNx+OLx,1-OLy:sNy+OLy,myNr,nSx,nSy) _RS arrMask(1-OLx:sNx+OLx,1-OLy:sNy+OLy,mskNr,nSx,nSy) _RS arrhFac(1-OLx:sNx+OLx,1-OLy:sNy+OLy,mskNr,nSx,nSy) _RS arrArea(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy) _RS arrY(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy) _RS arrDr(myNr) _RL theMin(nSepBnd) _RL theMax(nSepBnd) _RL theMean(nSepBnd) _RL theVar(nSepBnd) _RL theVol(nSepBnd) INTEGER myThid CEOP C !LOCAL VARIABLES: C msgBuf :: Informational/error meesage buffer CHARACTER*(MAX_LEN_MBUF) msgBuf INTEGER bi,bj,i,j,k,n INTEGER km, k1, k2 LOGICAL noPnts(Ny) _RL tmpVal _RL tmpVol INTEGER nSepDim PARAMETER ( nSepDim = 200 ) _RL tileVol (nSx,nSy,nSepDim) _RL tileMean(nSx,nSy,nSepDim) _RL tileVar (nSx,nSy,nSepDim) C- Check local Dim IF ( nSepBnd .GT. nSepDim ) THEN WRITE(msgBuf,'(A,I6,A)') & 'MON_STATS_LATBND_RL: local array Dim (nSepDim=',nSepDim, & ' ) too small' CALL PRINT_ERROR( msgBuf , myThid) WRITE(msgBuf,'(A,I6)') & 'MON_STATS_LATBND_RL: Need nSepDim to be at least =', nSepBnd CALL PRINT_ERROR( msgBuf , myThid) STOP 'ABNORMAL END: S/R MON_STATS_LATBND_RL' ENDIF IF ( kLoc.EQ.0 ) THEN k1 = 1 k2 = myNr ELSE k1 = kLoc k2 = kLoc ENDIF DO n=1,nSepBnd noPnts(n)=.TRUE. theMin(n)=0. theMax(n)=0. theMean(n)=0. theVar(n)=0. theVol(n)=0. ENDDO DO bj=myByLo(myThid),myByHi(myThid) DO bi=myBxLo(myThid),myBxHi(myThid) DO n=1,nSepBnd tileVol (bi,bj,n) = 0. tileMean(bi,bj,n) = 0. tileVar (bi,bj,n) = 0. ENDDO DO k=k1,k2 km = MIN(k,mskNr) DO j=1,sNy DO i=1,sNx n = NLATBND(nSepBnd, ySepBnd, arrY(i,j,bi,bj) ) tmpVal=arr(i,j,k,bi,bj) IF (arrMask(i,j,km,bi,bj).NE.0. .AND. noPnts(n)) THEN theMin(n)=tmpVal theMax(n)=tmpVal noPnts(n)=.FALSE. ENDIF IF (arrMask(i,j,km,bi,bj).NE.0.) THEN theMin(n)=MIN(theMin(n),tmpVal) theMax(n)=MAX(theMax(n),tmpVal) tmpVol = arrArea(i,j,bi,bj)*arrhFac(i,j,km,bi,bj)*arrDr(k) & *arrMask(i,j,km,bi,bj) tileVol (bi,bj,n) = tileVol (bi,bj,n) + tmpVol tileMean(bi,bj,n) = tileMean(bi,bj,n) + tmpVol*tmpVal tileVar (bi,bj,n) = tileVar (bi,bj,n) + tmpVol*tmpVal*tmpVal ENDIF ENDDO ENDDO ENDDO ENDDO ENDDO DO n=1,nSepBnd CALL GLOBAL_SUM_TILE_RL( tileVol(1,1,n) , theVol(n) , myThid ) CALL GLOBAL_SUM_TILE_RL( tileMean(1,1,n), theMean(n), myThid ) CALL GLOBAL_SUM_TILE_RL( tileVar(1,1,n) , theVar(n) , myThid ) ENDDO DO n=1,nSepBnd IF (theVol(n).GT.0.) THEN theMean(n)= theMean(n)/theVol(n) theVar(n) = theVar(n) /theVol(n) theVar(n) = theVar(n) -theMean(n)*theMean(n) IF ( noPnts(n) ) theMin(n) = theMean(n) theMin(n) = -theMin(n) _GLOBAL_MAX_RL(theMin(n), myThid) theMin(n)=-theMin(n) IF ( noPnts(n) ) theMax(n) = theMin(n) _GLOBAL_MAX_RL(theMax(n), myThid) ENDIF ENDDO RETURN END
C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----| CBOP C !ROUTINE: NLATBND C !INTERFACE: INTEGER FUNCTION NLATBND( nBnd, yBnd, yLoc ) IMPLICIT NONE C !DESCRIPTION: C Find the latidude band of yLoc in nSep strip C !INPUT PARAMETERS: C nBnd :: Number of latitude bands C yBnd :: latitude of southern boundary (for each lat. band) C yLoc :: current latitude INTEGER nBnd _RS yBnd(nBnd) _RS yLoc CEOP C !LOCAL VARIABLES: INTEGER n NLATBND = 1 DO n=2,nBnd IF (yLoc .GT. yBnd(n)) NLATBND = n ENDDO RETURN END
C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|