C $Header: /u/gcmpack/MITgcm/pkg/monitor/mon_stats_rs.F,v 1.9 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_RS
C !INTERFACE:
SUBROUTINE MON_STATS_RS(
I myNr, arr,
O theMin,theMax,theMean,theSD,
I myThid )
C !DESCRIPTION:
C Calculate bare statistics of global array ``\_RS arr''.
C !USES:
IMPLICIT NONE
#include "SIZE.h"
#include "EEPARAMS.h"
C !INPUT PARAMETERS:
INTEGER myNr
_RS arr(1-OLx:sNx+OLx,1-OLy:sNy+OLy,myNr,nSx,nSy)
_RL theMin, theMax, theMean, theSD
INTEGER myThid
CEOP
C !LOCAL VARIABLES:
INTEGER bi,bj,I,J,K
INTEGER numPnts
LOGICAL noPnts
_RL tmpVal,rNumPnts
_RL theVar
_RL tileMean(nSx,nSy)
_RL tileVar (nSx,nSy)
_RL tileSD (nSx,nSy)
theMin = 0.
theMax = 0.
theMean= 0.
theSD = 0.
theVar = 0.
numPnts= 0
noPnts = .TRUE.
DO bj=myByLo(myThid),myByHi(myThid)
DO bi=myBxLo(myThid),myBxHi(myThid)
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)
c IF (tmpVal.NE.0. .AND. noPnts) THEN
IF ( noPnts ) THEN
theMin = tmpVal
theMax = tmpVal
noPnts = .FALSE.
ENDIF
c IF (tmpVal.NE.0.) THEN
theMin = MIN(theMin,tmpVal)
theMax = MAX(theMax,tmpVal)
tileMean(bi,bj)=tileMean(bi,bj)+tmpVal
tileVar (bi,bj)=tileVar (bi,bj)+tmpVal*tmpVal
numPnts=numPnts+1
c ENDIF
ENDDO
ENDDO
ENDDO
c theMean=theMean+tileMean(bi,bj)
c theVar =theVar +tileVar (bi,bj)
ENDDO
ENDDO
c _GLOBAL_SUM_RL(theMean,myThid)
c _GLOBAL_SUM_RL(theVar,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
theMean=theMean*rNumPnts
theVar=theVar*rNumPnts
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)
c IF (tmpVal.NE.0.) THEN
tileSD(bi,bj) = tileSD(bi,bj)
& + (tmpVal-theMean)*(tmpVal-theMean)
c 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*rNumPnts)
c theSD = SQRT(theVar-theMean*theMean)
ENDIF
RETURN
END