C $Header: /u/gcmpack/MITgcm/pkg/diagnostics/diagstats_local.F,v 1.4 2005/07/11 19:02:17 jmc Exp $
C $Name:  $

#include "DIAG_OPTIONS.h"

CBOP
C     !ROUTINE: DIAGSTATS_LOCAL
C     !INTERFACE:
      SUBROUTINE DIAGSTATS_LOCAL(
     U                  statFld,
     I                  inpFld, frcFld,
     I                  scaleFact, power, useFract, sizF,
     I                  sizI1,sizI2,sizJ1,sizJ2,sizK,sizTx,sizTy,
     I                  iRun,jRun,kIn,biIn,bjIn,
     I                  k,bi,bj, region2fill, ndId, parsFld,
     I                  myThid)

C     !DESCRIPTION:
C     Update array statFld
C     by adding statistics over the range [1:iRun],[1:jRun]
C     from input field array inpFld
C- note:
C   a) this S/R should not see DIAGNOSTICS pkg commons blocks (in DIAGNOSTICS.h)
C   b) for main grid variables, get area & weigting factors (to compute global mean)
C      from the main common blocks.
C   c) for other type of grids, call a specifics S/R which include its own
C      grid common blocks

C     !USES:
      IMPLICIT NONE

#include "EEPARAMS.h"
#include "SIZE.h"
#include "DIAGNOSTICS_SIZE.h"
#include "PARAMS.h"
#include "GRID.h"
c #include "SURFACE.h"

C     !INPUT/OUTPUT PARAMETERS:
C     == Routine Arguments ==
C     statFld     :: cumulative statistics array (updated)
C     inpFld      :: input field array to process (compute stats & add to statFld)
C     frcFld      :: fraction used for weighted-average diagnostics
C     scaleFact   :: scaling factor
C     power       :: option to fill-in with the field square (power=2)
C     useFract    :: if True, use fraction-weight
C     sizF        :: size of frcFld array: 3rd  dimension
C     sizI1,sizI2 :: size of inpFld array: 1rst index range (min,max)
C     sizJ1,sizJ2 :: size of inpFld array: 2nd  index range (min,max)
C     sizK        :: size of inpFld array: 3rd  dimension
C     sizTx,sizTy :: size of inpFld array: tile dimensions
C     iRun,jRun   :: range of 1rst & 2nd index
C     kIn         :: level index of inpFld array to porcess
C     biIn,bjIn   :: tile indices of inpFld array to process
C     k,bi,bj     :: level and tile indices used for weighting (mask,area ...)
C     region2fill :: indicates whether to compute statistics over this region
C     ndId        :: Diagnostics Id Number (in available diag. list)
C     parsFld     :: parser field with characteristics of the diagnostics
C     myThid      :: my Thread Id number
      _RL     statFld(0:nStats,0:nRegions)
      INTEGER sizI1,sizI2,sizJ1,sizJ2
      INTEGER sizF,sizK,sizTx,sizTy
      _RL     inpFld(sizI1:sizI2,sizJ1:sizJ2,sizK,sizTx,sizTy)
      _RL     frcFld(sizI1:sizI2,sizJ1:sizJ2,sizF,sizTx,sizTy)
      _RL     scaleFact
      INTEGER power
      LOGICAL useFract
      INTEGER iRun, jRun, kIn, biIn, bjIn
      INTEGER k, bi, bj, ndId
      INTEGER region2fill(0:nRegions)
      CHARACTER*16 parsFld
      INTEGER myThid
CEOP

C     !LOCAL VARIABLES:
C     i,j    :: loop indices
      INTEGER i, n, km, kFr
      INTEGER im, ix, iv
      PARAMETER ( iv = nStats - 2 , im = nStats - 1 , ix = nStats )
      LOGICAL exclSpVal
      LOGICAL useWeight
      _RL statLoc(0:nStats)
      _RL drLoc
      _RL specialVal
      _RL getcon
      EXTERNAL 

C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|

      useWeight = .FALSE.
      exclSpVal = .FALSE.
      specialVal = 0.
      IF ( useFIZHI ) THEN
        exclSpVal = .TRUE.
        specialVal = getcon('UNDEF')
      ENDIF
      kFr = MIN(kIn,sizF)

      DO n=0,nRegions
       IF (region2fill(n).NE.0) THEN
C---   Compute statistics for this tile, level and region:

C-     case of a special region (no specific regional mask)
        IF ( n.EQ.0 ) THEN

         IF ( parsFld(10:10) .EQ. 'R' ) THEN

          drLoc = drF(k)
          IF ( parsFld(9:9).EQ.'L') drLoc = drC(k)
          IF ( parsFld(9:9).EQ.'U') drLoc = drC(MIN(k+1,Nr))
          IF ( parsFld(9:9).EQ.'M') useWeight = .TRUE.

          IF     ( parsFld(2:2).EQ.'U' ) THEN
           CALL  DIAGSTATS_CALC(
     O            statLoc,
     I            inpFld(sizI1,sizJ1,kIn,biIn,bjIn),
     I            frcFld(sizI1,sizJ1,kFr,biIn,bjIn),
     I            scaleFact, power, useFract,
     I            nStats,sizI1,sizI2,sizJ1,sizJ2,iRun,jRun,
     I            maskH(1-Olx,1-Oly,bi,bj), maskW(1-Olx,1-Oly,k,bi,bj),
     I            hFacW(1-Olx,1-Oly,k,bi,bj), rAw(1-Olx,1-Oly,bi,bj),
     I            drLoc, specialVal, exclSpVal, useWeight, myThid )
c    I            drLoc, k,bi,bj, parsFld, myThid )
          ELSEIF ( parsFld(2:2).EQ.'V' ) THEN
           CALL  DIAGSTATS_CALC(
     O            statLoc,
     I            inpFld(sizI1,sizJ1,kIn,biIn,bjIn),
     I            frcFld(sizI1,sizJ1,kFr,biIn,bjIn),
     I            scaleFact, power, useFract,
     I            nStats,sizI1,sizI2,sizJ1,sizJ2,iRun,jRun,
     I            maskH(1-Olx,1-Oly,bi,bj), maskS(1-Olx,1-Oly,k,bi,bj),
     I            hFacS(1-Olx,1-Oly,k,bi,bj), rAs(1-Olx,1-Oly,bi,bj),
     I            drLoc, specialVal, exclSpVal, useWeight, myThid )
          ELSE
           CALL  DIAGSTATS_CALC(
     O            statLoc,
     I            inpFld(sizI1,sizJ1,kIn,biIn,bjIn),
     I            frcFld(sizI1,sizJ1,kFr,biIn,bjIn),
     I            scaleFact, power, useFract,
     I            nStats,sizI1,sizI2,sizJ1,sizJ2,iRun,jRun,
     I            maskH(1-Olx,1-Oly,bi,bj), maskC(1-Olx,1-Oly,k,bi,bj),
     I            hFacC(1-Olx,1-Oly,k,bi,bj), rA(1-Olx,1-Oly,bi,bj),
     I            drLoc, specialVal, exclSpVal, useWeight, myThid )
          ENDIF

         ELSEIF ( useFIZHI .AND.
     &           (parsFld(10:10).EQ.'L' .OR. parsFld(10:10).EQ.'M')
     &          ) THEN
           CALL  DIAGSTATS_LM_CALC(
     O            statLoc,
     I            inpFld(sizI1,sizJ1,kIn,biIn,bjIn),
     I            frcFld(sizI1,sizJ1,kFr,biIn,bjIn),
     I            scaleFact, power, useFract,
     I            nStats,sizI1,sizI2,sizJ1,sizJ2,iRun,jRun,
     I            maskH(1-Olx,1-Oly,bi,bj), maskH(1-Olx,1-Oly,bi,bj),
     I            rA(1-Olx,1-Oly,bi,bj),
     I            specialVal, exclSpVal,
     I            k,bi,bj, parsFld, myThid )
         ELSEIF ( useLand .AND.
     &           (parsFld(10:10).EQ.'G' .OR. parsFld(10:10).EQ.'g')
     &          ) THEN
           CALL  DIAGSTATS_G_CALC(
     O            statLoc,
     I            inpFld(sizI1,sizJ1,kIn,biIn,bjIn),
     I            frcFld(sizI1,sizJ1,kFr,biIn,bjIn),
     I            scaleFact, power, useFract,
     I            nStats,sizI1,sizI2,sizJ1,sizJ2,iRun,jRun,
     I            maskH(1-Olx,1-Oly,bi,bj),
     I            rA(1-Olx,1-Oly,bi,bj),
     I            specialVal, exclSpVal,
     I            k,bi,bj, parsFld, myThid )
c        ELSEIF ( parsFld(10:10) .EQ. 'I' ) THEN
c        ELSEIF ( parsFld(10:10) .EQ. '1' ) THEN
         ELSE

          km = 1
          IF ( usingPCoords ) km = Nr
          drLoc = 1. _d 0
          IF     ( parsFld(2:2).EQ.'U' ) THEN
           CALL  DIAGSTATS_CALC(
     O            statLoc,
     I            inpFld(sizI1,sizJ1,kIn,biIn,bjIn),
     I            frcFld(sizI1,sizJ1,kFr,biIn,bjIn),
     I            scaleFact, power, useFract,
     I            nStats,sizI1,sizI2,sizJ1,sizJ2,iRun,jRun,
     I            maskH(1-Olx,1-Oly,bi,bj), maskW(1-Olx,1-Oly,km,bi,bj),
     I            maskW(1-Olx,1-Oly,km,bi,bj),rAw(1-Olx,1-Oly,bi,bj),
     I            drLoc, specialVal, exclSpVal, useWeight, myThid )
          ELSEIF ( parsFld(2:2).EQ.'V' ) THEN
           CALL  DIAGSTATS_CALC(
     O            statLoc,
     I            inpFld(sizI1,sizJ1,kIn,biIn,bjIn),
     I            frcFld(sizI1,sizJ1,kFr,biIn,bjIn),
     I            scaleFact, power, useFract,
     I            nStats,sizI1,sizI2,sizJ1,sizJ2,iRun,jRun,
     I            maskH(1-Olx,1-Oly,bi,bj), maskS(1-Olx,1-Oly,km,bi,bj),
     I            maskS(1-Olx,1-Oly,km,bi,bj),rAs(1-Olx,1-Oly,bi,bj),
     I            drLoc, specialVal, exclSpVal, useWeight, myThid )
          ELSE
           CALL  DIAGSTATS_CALC(
     O            statLoc,
     I            inpFld(sizI1,sizJ1,kIn,biIn,bjIn),
     I            frcFld(sizI1,sizJ1,kFr,biIn,bjIn),
     I            scaleFact, power, useFract,
     I            nStats,sizI1,sizI2,sizJ1,sizJ2,iRun,jRun,
     I            maskH(1-Olx,1-Oly,bi,bj), maskH(1-Olx,1-Oly,bi,bj),
     I            maskH(1-Olx,1-Oly,bi,bj), rA(1-Olx,1-Oly,bi,bj),
     I            drLoc, specialVal, exclSpVal, useWeight, myThid )
          ENDIF

         ENDIF

C     Update cumulative statistics array
          IF ( statLoc(0).GT.0. ) THEN
            IF ( statFld(0,n).LE.0. ) THEN
              statFld(im,n) = statLoc(im)
              statFld(ix,n) = statLoc(ix)
            ELSE
              statFld(im,n) = MIN( statFld(im,n), statLoc(im) )
              statFld(ix,n) = MAX( statFld(ix,n), statLoc(ix) )
            ENDIF
            DO i=0,iv
              statFld(i,n) = statFld(i,n) + statLoc(i)
            ENDDO
          ENDIF

        ENDIF

C---   processing region "n" ends here.
       ENDIF
      ENDDO

      RETURN
      END


C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----| CBOP C !ROUTINE: DIAGSTATS_LM_CALC C !INTERFACE: SUBROUTINE DIAGSTATS_LM_CALC( O statArr, I inpArr, frcArr, scaleFact, power, useFract, I nStats,sizI1,sizI2,sizJ1,sizJ2, iRun,jRun, I regMask, arrMask, arrArea, I specialVal, exclSpVal, I k,bi,bj, parsFld, myThid ) C !DESCRIPTION: C Compute statistics for this tile, level, region C using FIZHI level thickness C !USES: IMPLICIT NONE #include "EEPARAMS.h" #include "SIZE.h" #ifdef ALLOW_FIZHI #include "fizhi_SIZE.h" #include "gridalt_mapping.h" #endif C !INPUT/OUTPUT PARAMETERS: C == Routine Arguments == C statArr :: output statistics array C inpArr :: input field array to process (compute stats & add to statFld) C frcArr :: fraction used for weighted-average diagnostics C scaleFact :: scaling factor C power :: option to fill-in with the field square (power=2) C useFract :: if True, use fraction-weight C nStats :: size of output statArr C sizI1,sizI2 :: size of inpArr array: 1rst index range (min,max) C sizJ1,sizJ2 :: size of inpArr array: 2nd index range (min,max) C iRun,jRun :: range of 1rst & 2nd index to process C regMask :: regional mask C arrMask :: mask for this input array C arrArea :: Area weighting factor C specialVal :: special value in input array (to exclude if exclSpVal=T) C exclSpVal :: if T, exclude "specialVal" in input array C k,bi,bj :: level and tile indices used for weighting (mask,area ...) C parsFld :: parser field with characteristics of the diagnostics C myThid :: my Thread Id number INTEGER nStats,sizI1,sizI2,sizJ1,sizJ2 INTEGER iRun, jRun _RL statArr(0:nStats) _RL inpArr (sizI1:sizI2,sizJ1:sizJ2) _RL frcArr (sizI1:sizI2,sizJ1:sizJ2) _RL scaleFact INTEGER power LOGICAL useFract _RS regMask(1-OLx:sNx+OLx,1-OLy:sNy+OLy) _RS arrMask(1-OLx:sNx+OLx,1-OLy:sNy+OLy) _RS arrArea(1-OLx:sNx+OLx,1-OLy:sNy+OLy) _RL specialVal LOGICAL exclSpVal INTEGER k, bi, bj CHARACTER*16 parsFld INTEGER myThid CEOP #ifdef ALLOW_FIZHI C !LOCAL VARIABLES: LOGICAL useWeight INTEGER kl _RL drLoc c IF ( useFIZHI ) THEN IF ( parsFld(10:10).EQ.'L' ) THEN kl = 1 + Nrphys - k useWeight = .TRUE. ELSE kl = 1 useWeight = .FALSE. ENDIF drLoc = 1. _d 0 C- jmc: here we have a Problem if RL & RS are not the same: C since dpphys is RL but argument is RS. leave it like this for now C and will change it once the Regions are fully implemented. CALL DIAGSTATS_CALC( O statArr, I inpArr, frcArr, scaleFact, power, useFract, I nStats,sizI1,sizI2,sizJ1,sizJ2,iRun,jRun, I regMask, arrMask, I dpphys(1-Olx,1-Oly,kl,bi,bj), arrArea, I drLoc, specialVal, exclSpVal, useWeight, myThid ) c ENDIF #endif /* ALLOW_FIZHI */ RETURN END


C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----| CBOP C !ROUTINE: DIAGSTATS_G_CALC C !INTERFACE: SUBROUTINE DIAGSTATS_G_CALC( O statArr, I inpArr, frcArr, scaleFact, power, useFract, I nStats,sizI1,sizI2,sizJ1,sizJ2, iRun,jRun, I regMask, arrArea, I specialVal, exclSpVal, I k,bi,bj, parsFld, myThid ) C !DESCRIPTION: C Compute statistics for this tile, level, region C using "ground" (land) type fraction C !USES: IMPLICIT NONE #include "EEPARAMS.h" #ifdef ALLOW_LAND # include "LAND_SIZE.h" # include "LAND_PARAMS.h" # ifdef ALLOW_AIM # include "AIM_FFIELDS.h" # endif #else # include "SIZE.h" #endif C !INPUT/OUTPUT PARAMETERS: C == Routine Arguments == C statArr :: output statistics array C inpArr :: input field array to process (compute stats & add to statFld) C frcArr :: fraction used for weighted-average diagnostics C scaleFact :: scaling factor C power :: option to fill-in with the field square (power=2) C useFract :: if True, use fraction-weight C nStats :: size of output statArr C sizI1,sizI2 :: size of inpArr array: 1rst index range (min,max) C sizJ1,sizJ2 :: size of inpArr array: 2nd index range (min,max) C iRun,jRun :: range of 1rst & 2nd index to process C regMask :: regional mask C arrArea :: Area weighting factor C specialVal :: special value in input array (to exclude if exclSpVal=T) C exclSpVal :: if T, exclude "specialVal" in input array C k,bi,bj :: level and tile indices used for weighting (mask,area ...) C parsFld :: parser field with characteristics of the diagnostics C myThid :: my Thread Id number INTEGER nStats,sizI1,sizI2,sizJ1,sizJ2 INTEGER iRun, jRun _RL statArr(0:nStats) _RL inpArr (sizI1:sizI2,sizJ1:sizJ2) _RL frcArr (sizI1:sizI2,sizJ1:sizJ2) _RL scaleFact INTEGER power LOGICAL useFract _RS regMask(1-OLx:sNx+OLx,1-OLy:sNy+OLy) _RS arrMask(1-OLx:sNx+OLx,1-OLy:sNy+OLy) _RS arrArea(1-OLx:sNx+OLx,1-OLy:sNy+OLy) _RL specialVal LOGICAL exclSpVal INTEGER k, bi, bj CHARACTER*16 parsFld INTEGER myThid CEOP #ifdef ALLOW_LAND C !LOCAL VARIABLES: LOGICAL useWeight INTEGER kl _RL drLoc c IF ( useLand ) THEN IF ( parsFld(10:10).EQ.'G' ) THEN kl = MIN(k,land_nLev) drLoc = land_dzF(kl) ELSE drLoc = 1. _d 0 ENDIF useWeight = .TRUE. CALL DIAGSTATS_CALC( O statArr, I inpArr, frcArr, scaleFact, power, useFract, I nStats,sizI1,sizI2,sizJ1,sizJ2,iRun,jRun, I regMask, aim_landFr(1-Olx,1-Oly,bi,bj), I aim_landFr(1-Olx,1-Oly,bi,bj), arrArea, I drLoc, specialVal, exclSpVal, useWeight, myThid ) c ENDIF #endif /* ALLOW_LAND */ RETURN END


C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----| CBOP C !ROUTINE: DIAGSTATS_CALC C !INTERFACE: SUBROUTINE DIAGSTATS_CALC( O statArr, I inpArr, frcArr, scaleFact, power, useFract, I nStats,sizI1,sizI2,sizJ1,sizJ2, iRun,jRun, I regMask, arrMask, arrhFac, arrArea, I arrDr, specialVal, exclSpVal, useWeight, I myThid ) C !DESCRIPTION: C Compute statistics for this tile, level, region C !USES: IMPLICIT NONE #include "EEPARAMS.h" #include "SIZE.h" C !INPUT/OUTPUT PARAMETERS: C == Routine Arguments == C statArr :: output statistics array C inpArr :: input field array to process (compute stats & add to statFld) C frcArr :: fraction used for weighted-average diagnostics C scaleFact :: scaling factor C power :: option to fill-in with the field square (power=2) C useFract :: if True, use fraction-weight C nStats :: size of output array: statArr C sizI1,sizI2 :: size of inpArr array: 1rst index range (min,max) C sizJ1,sizJ2 :: size of inpArr array: 2nd index range (min,max) C iRun,jRun :: range of 1rst & 2nd index to process C regMask :: regional mask C arrMask :: mask for this input array C arrhFac :: weight factor (horizontally varying) C arrArea :: Area weighting factor C arrDr :: uniform weighting factor C specialVal :: special value in input array (to exclude if exclSpVal=T) C exclSpVal :: if T, exclude "specialVal" in input array C useWeight :: use weight factor "arrhFac" Cc k,bi,bj :: level and tile indices used for weighting (mask,area ...) Cc parsFld :: parser field with characteristics of the diagnostics C myThid :: my Thread Id number INTEGER nStats,sizI1,sizI2,sizJ1,sizJ2 INTEGER iRun, jRun _RL statArr(0:nStats) _RL inpArr (sizI1:sizI2,sizJ1:sizJ2) _RL frcArr (sizI1:sizI2,sizJ1:sizJ2) _RL scaleFact INTEGER power LOGICAL useFract _RS regMask(1-OLx:sNx+OLx,1-OLy:sNy+OLy) _RS arrMask(1-OLx:sNx+OLx,1-OLy:sNy+OLy) _RS arrhFac(1-OLx:sNx+OLx,1-OLy:sNy+OLy) _RS arrArea(1-OLx:sNx+OLx,1-OLy:sNy+OLy) _RL arrDr _RL specialVal LOGICAL exclSpVal LOGICAL useWeight INTEGER myThid CEOP C !LOCAL VARIABLES: C i,j :: loop indices INTEGER i, j, n INTEGER im, ix _RL tmpVol _RL tmpFld _RL tmpFac im = nStats - 1 ix = nStats DO n=0,nStats statArr(n) = 0. ENDDO tmpFac = scaleFact IF ( power.EQ.2) tmpFac = scaleFact*scaleFact IF ( useFract .AND. exclSpVal ) THEN DO j = 1,jRun DO i = 1,iRun IF ( arrMask(i,j).NE.0. .AND. frcArr(i,j).NE.0. & .AND. inpArr(i,j).NE.specialVal ) THEN IF ( power.EQ.2) THEN tmpFld = tmpFac*inpArr(i,j)*inpArr(i,j) ELSE tmpFld = tmpFac*inpArr(i,j) ENDIF IF ( statArr(0).EQ.0. ) THEN statArr(im) = tmpFld statArr(ix) = tmpFld ELSE statArr(im) = MIN(tmpFld,statArr(im)) statArr(ix) = MAX(tmpFld,statArr(ix)) ENDIF IF ( useWeight ) THEN tmpVol = arrDr*arrhFac(i,j)*arrArea(i,j)*frcArr(i,j) ELSE tmpVol = arrDr*arrArea(i,j)*frcArr(i,j) ENDIF statArr(0) = statArr(0) + tmpVol statArr(1) = statArr(1) + tmpVol*tmpFld statArr(2) = statArr(2) + tmpVol*tmpFld*tmpFld ENDIF ENDDO ENDDO ELSEIF ( useFract ) THEN DO j = 1,jRun DO i = 1,iRun IF ( arrMask(i,j).NE.0. .AND. frcArr(i,j).NE.0. ) THEN IF ( power.EQ.2) THEN tmpFld = tmpFac*inpArr(i,j)*inpArr(i,j) ELSE tmpFld = tmpFac*inpArr(i,j) ENDIF IF ( statArr(0).EQ.0. ) THEN statArr(im) = tmpFld statArr(ix) = tmpFld ELSE statArr(im) = MIN(tmpFld,statArr(im)) statArr(ix) = MAX(tmpFld,statArr(ix)) ENDIF IF ( useWeight ) THEN tmpVol = arrDr*arrhFac(i,j)*arrArea(i,j)*frcArr(i,j) ELSE tmpVol = arrDr*arrArea(i,j)*frcArr(i,j) ENDIF statArr(0) = statArr(0) + tmpVol statArr(1) = statArr(1) + tmpVol*tmpFld statArr(2) = statArr(2) + tmpVol*tmpFld*tmpFld ENDIF ENDDO ENDDO ELSEIF ( exclSpVal ) THEN DO j = 1,jRun DO i = 1,iRun IF ( arrMask(i,j).NE.0. & .AND. inpArr(i,j).NE.specialVal ) THEN IF ( power.EQ.2) THEN tmpFld = tmpFac*inpArr(i,j)*inpArr(i,j) ELSE tmpFld = tmpFac*inpArr(i,j) ENDIF IF ( statArr(0).EQ.0. ) THEN statArr(im) = tmpFld statArr(ix) = tmpFld ELSE statArr(im) = MIN(tmpFld,statArr(im)) statArr(ix) = MAX(tmpFld,statArr(ix)) ENDIF IF ( useWeight ) THEN tmpVol = arrDr*arrhFac(i,j)*arrArea(i,j) ELSE tmpVol = arrDr*arrArea(i,j) ENDIF statArr(0) = statArr(0) + tmpVol statArr(1) = statArr(1) + tmpVol*tmpFld statArr(2) = statArr(2) + tmpVol*tmpFld*tmpFld ENDIF ENDDO ENDDO ELSE DO j = 1,jRun DO i = 1,iRun c IF ( regMask(i,j).NE.0. .AND. arrMask(i,j).NE.0. ) THEN IF ( arrMask(i,j).NE.0. ) THEN IF ( power.EQ.2) THEN tmpFld = tmpFac*inpArr(i,j)*inpArr(i,j) ELSE tmpFld = tmpFac*inpArr(i,j) ENDIF IF ( statArr(0).EQ.0. ) THEN statArr(im) = tmpFld statArr(ix) = tmpFld ELSE statArr(im) = MIN(tmpFld,statArr(im)) statArr(ix) = MAX(tmpFld,statArr(ix)) ENDIF IF ( useWeight ) THEN tmpVol = arrDr*arrhFac(i,j)*arrArea(i,j) ELSE tmpVol = arrDr*arrArea(i,j) ENDIF statArr(0) = statArr(0) + tmpVol statArr(1) = statArr(1) + tmpVol*tmpFld statArr(2) = statArr(2) + tmpVol*tmpFld*tmpFld ENDIF ENDDO ENDDO ENDIF RETURN END