C $Header: /u/gcmpack/MITgcm/pkg/debug/debug_fld_stats_rl.F,v 1.4 2016/07/26 16:23:52 jmc Exp $ C $Name: $ #include "DEBUG_OPTIONS.h" C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----| CBOP C !ROUTINE: DEBUG_FLD_STATS_RL C !INTERFACE: SUBROUTINE DEBUG_FLD_STATS_RL( I myNr, arr, exclValue, O theMin, theMax, theMean, theSD, I myThid ) C *==========================================================* C | SUBROUTINE DEBUG_FLD_STATS_RL | C | o Calculate bare statistics of global array "_RL arr" | C *==========================================================* C !USES: IMPLICIT NONE C === Global data === #include "SIZE.h" #include "EEPARAMS.h" C !INPUT/OUTPUT PARAMETERS: C myNr :: 3rd dimension of input field array C arr :: input field array C exclValue :: exclusion value C theMin :: field minimum value C theMax :: field maximun value C theMean :: field averaged value C theStD :: field Standard Deviation C myThid :: my Thread Id number INTEGER myNr _RL arr(1-OLx:sNx+OLx,1-OLy:sNy+OLy,myNr,nSx,nSy) _RL exclValue _RL theMin _RL theMax _RL theMean _RL theSD INTEGER myThid C !LOCAL VARIABLES: INTEGER bi,bj,i,j,k LOGICAL noPnts _RL tmpVal _RL nbPnts, rNbPnts _RL theVar _RL tileMean(nSx,nSy) _RL tileVar (nSx,nSy) _RL tileSD (nSx,nSy) _RL tileNbPt(nSx,nSy) CEOP theMin = 0. theMax = 0. theMean= 0. theSD = 0. theVar = 0. nbPnts = 0. noPnts = .TRUE. DO bj=myByLo(myThid),myByHi(myThid) DO bi=myBxLo(myThid),myBxHi(myThid) tileNbPt(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 ( tmpVal.NE.exclValue .AND. noPnts ) THEN theMin = tmpVal theMax = tmpVal noPnts = .FALSE. ENDIF IF ( tmpVal.NE.exclValue ) THEN theMin = MIN( theMin, tmpVal ) theMax = MAX( theMax, tmpVal ) tileNbPt(bi,bj) = tileNbPt(bi,bj) + 1. _d 0 tileMean(bi,bj) = tileMean(bi,bj) + tmpVal tileVar (bi,bj) = tileVar (bi,bj) + tmpVal*tmpVal ENDIF ENDDO ENDDO ENDDO ENDDO ENDDO CALL GLOBAL_SUM_TILE_RL( tileNbPt, nbPnts, myThid ) CALL GLOBAL_SUM_TILE_RL( tileMean, theMean, myThid ) c CALL GLOBAL_SUM_TILE_RL( tileVar , theVar, myThid ) IF ( nbPnts.GT.zeroRL ) THEN rNbPnts = 1. _d 0/nbPnts theMean = theMean*rNbPnts c theVar = theVar *rNbPnts 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 ( tmpVal.NE.exclValue ) THEN tileSD(bi,bj) = tileSD(bi,bj) & + (tmpVal-theMean)*(tmpVal-theMean) ENDIF ENDDO ENDDO ENDDO ENDDO ENDDO CALL GLOBAL_SUM_TILE_RL( tileSD, theSD, myThid ) theSD = SQRT( theSD*rNbPnts ) c theSD = SQRT( theVar - theMean*theMean ) ENDIF RETURN END