C $Header: /u/gcmpack/MITgcm/pkg/monitor/mon_stats_rl.F,v 1.15 2010/01/26 01:09:02 jmc Exp $
C $Name: $
#include "MONITOR_OPTIONS.h"
C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
CBOP
C !ROUTINE: MON_STATS_RL
C !INTERFACE:
SUBROUTINE MON_STATS_RL(
I myNr, arr, arrMask,arrhFac, arrArea, arrDr,
O theMin,theMax,theMean,theSD,theDel2,theVol,
I myThid )
C Calculate bare statistics of global array ``\_RL arr''.
C !USES:
IMPLICIT NONE
#include "SIZE.h"
#include "EEPARAMS.h"
C !INPUT PARAMETERS:
INTEGER myNr
_RL arr(1-OLx:sNx+OLx,1-OLy:sNy+OLy,myNr,nSx,nSy)
_RS arrMask(1-OLx:sNx+OLx,1-OLy:sNy+OLy,myNr,nSx,nSy)
_RS arrhFac(1-OLx:sNx+OLx,1-OLy:sNy+OLy,myNr,nSx,nSy)
_RS arrArea(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
_RS arrDr(myNr)
_RL theMin, theMax, theMean, theSD, theDel2, theVol
INTEGER myThid
CEOP
C !LOCAL VARIABLES:
INTEGER bi,bj,I,J,K
INTEGER numPnts
LOGICAL noPnts
_RL tmpVal,rNumPnts
_RL theVar
_RL tmpVol
_RL tileMean(nSx,nSy)
_RL tileVar (nSx,nSy)
_RL tileSD (nSx,nSy)
_RL tileDel2(nSx,nSy)
_RL tileVol (nSx,nSy)
C Since 2009/12/21 MON_CALC_STATS_RL replaces MON_STATS_RL
C which is now disabled
STOP 'ABNORMAL END: S/R MON_STATS_RL no longer maintained'
theMin=0.
theMax=0.
theMean=0.
theSD=0.
theVar=0.
theDel2=0.
theVol=0.
numPnts=0
noPnts=.TRUE.
DO bj=myByLo(myThid),myByHi(myThid)
DO bi=myBxLo(myThid),myBxHi(myThid)
tileDel2(bi,bj) = 0.
tileVol (bi,bj) = 0.
tileMean(bi,bj) = 0.
tileVar (bi,bj) = 0.
DO K=1,myNr
DO J=1,sNy
DO I=1,sNx
tmpVal=arr(I,J,K,bi,bj)
IF (arrMask(I,J,K,bi,bj).NE.0. .AND. noPnts) THEN
theMin=tmpVal
theMax=tmpVal
noPnts=.FALSE.
ENDIF
IF (arrMask(I,J,K,bi,bj).NE.0.) THEN
theMin=min(theMin,tmpVal)
theMax=max(theMax,tmpVal)
tileDel2(bi,bj) = tileDel2(bi,bj)
& + 0.25*ABS(
& (arr(I+1,J,K,bi,bj)-tmpVal)*arrMask(I+1,J,K,bi,bj)
& +(arr(I-1,J,K,bi,bj)-tmpVal)*arrMask(I-1,J,K,bi,bj)
& +(arr(I,J+1,K,bi,bj)-tmpVal)*arrMask(I,J+1,K,bi,bj)
& +(arr(I,J-1,K,bi,bj)-tmpVal)*arrMask(I,J-1,K,bi,bj)
& )
numPnts=numPnts+1
tmpVol = arrArea(I,J,bi,bj)*arrhFac(I,J,K,bi,bj)*arrDr(K)
& *arrMask(I,J,K,bi,bj)
tileVol (bi,bj) = tileVol (bi,bj) + tmpVol
tileMean(bi,bj) = tileMean(bi,bj) + tmpVol*tmpVal
tileVar (bi,bj) = tileVar (bi,bj) + tmpVol*tmpVal*tmpVal
ENDIF
ENDDO
ENDDO
ENDDO
c theDel2 = theDel2 + tileDel2(bi,bj)
c theVol = theVol + tileVol(bi,bj)
c theMean = theMean + tileMean(bi,bj)
c theVar = theVar + tileVar (bi,bj)
ENDDO
ENDDO
c _GLOBAL_SUM_RL(theDel2,myThid)
c _GLOBAL_SUM_RL(theVol,myThid)
c _GLOBAL_SUM_RL(theMean,myThid)
c _GLOBAL_SUM_RL(theVar,myThid)
CALL GLOBAL_SUM_TILE_RL( tileDel2, theDel2, myThid )
CALL GLOBAL_SUM_TILE_RL( tileVol , theVol , myThid )
CALL GLOBAL_SUM_TILE_RL( tileMean, theMean, myThid )
CALL GLOBAL_SUM_TILE_RL( tileVar , theVar , myThid )
tmpVal=FLOAT(numPnts)
_GLOBAL_SUM_RL(tmpVal,myThid)
numPnts=NINT(tmpVal)
IF (tmpVal.GT.0.) THEN
rNumPnts=1. _d 0/tmpVal
theDel2=theDel2*rNumPnts
ENDIF
IF (theVol.GT.0.) THEN
theMean=theMean/theVol
theVar=theVar/theVol
IF ( noPnts ) theMin = theMean
theMin=-theMin
_GLOBAL_MAX_RL(theMin,myThid)
theMin=-theMin
IF ( noPnts ) theMax = theMean
_GLOBAL_MAX_RL(theMax,myThid)
DO bj=myByLo(myThid),myByHi(myThid)
DO bi=myBxLo(myThid),myBxHi(myThid)
tileSD(bi,bj)=0.
DO K=1,myNr
DO J=1,sNy
DO I=1,sNx
tmpVal=arr(I,J,K,bi,bj)
IF (arrMask(I,J,K,bi,bj).NE.0.) THEN
tmpVol=arrArea(I,J,bi,bj)*arrhFac(I,J,K,bi,bj)*arrDr(K)
& *arrMask(I,J,K,bi,bj)
tileSD(bi,bj) = tileSD(bi,bj)
& + tmpVol*(tmpVal-theMean)*(tmpVal-theMean)
ENDIF
ENDDO
ENDDO
ENDDO
c theSD = theSD + tileSD(bi,bj)
ENDDO
ENDDO
c _GLOBAL_SUM_RL(theSD,myThid)
CALL GLOBAL_SUM_TILE_RL( tileSD, theSD, myThid )
theSD = SQRT(theSD/theVol)
c theSD = SQRT(theVar-theMean*theMean)
ENDIF
RETURN
END