C $Header: /u/gcmpack/MITgcm/model/src/remove_mean.F,v 1.3 2009/04/28 18:30:33 jmc Exp $
C $Name:  $

#include "CPP_OPTIONS.h"

CBOP
C     !ROUTINE: REMOVE_MEAN_RL
C     !INTERFACE:
      SUBROUTINE REMOVE_MEAN_RL(
     I                myNr, arr, arrMask, arrhFac, arrArea, arrDr,
     I                arrName, myTime,
     I                myThid )
C     !DESCRIPTION: \bv
C     /==========================================================\
C     | SUBROUTINE REMOVE_MEAN_RL                                |
C     | o Calculate mean of global array "_RL arr" and substract |
C     |   it from the array                                      |
C     \==========================================================/
C     \ev

      IMPLICIT NONE

C     === Global data ===
#include "SIZE.h"
#include "EEPARAMS.h"
#include "PARAMS.h"

C     === Functions ====
      LOGICAL  DIFFERENT_MULTIPLE
      EXTERNAL 

C     === Routine arguments ===
      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)
      CHARACTER*(*) arrName
      _RL myTime
      INTEGER myThid

C#ifdef ALLOW_BALANCE_FLUXES
C     === Local variables ====
      INTEGER bi,bj,I,J,K
      _RL tmpVal
      _RL theMean
      _RL theVol
      _RL tmpVol
      CHARACTER*(max_len_mbuf) msgbuf
CEOP

      theMean=0.
      theVol=0.

      DO bj=myByLo(myThid),myByHi(myThid)
       DO bi=myBxLo(myThid),myBxHi(myThid)
        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)
            theVol = theVol   + tmpVol
            theMean = theMean + tmpVol*tmpVal
           ENDIF
          ENDDO
         ENDDO
        ENDDO
       ENDDO
      ENDDO

      _GLOBAL_SUM_RL(theVol,myThid)
      _GLOBAL_SUM_RL(theMean,myThid)

      IF (theVol.GT.0.) THEN
       theMean=theMean/theVol

       DO bj=myByLo(myThid),myByHi(myThid)
        DO bi=myBxLo(myThid),myBxHi(myThid)
         DO K=1,myNr
          DO J=1,sNy
           DO I=1,sNx
            IF (arrMask(I,J,K,bi,bj).NE.0.) THEN
             arr(I,J,K,bi,bj) = arr(I,J,K,bi,bj) - theMean
            ENDIF
           ENDDO
          ENDDO
         ENDDO
        ENDDO
       ENDDO

      ENDIF

C     Print the global mean to standard output, this is a measure for
C     the drift of the array arr
      IF ( balancePrintMean ) THEN
       _BEGIN_MASTER( myThid )
       WRITE(msgbuf,'(a,a,a,e24.17)')
     &      'REMOVE_MEAN_RL: Global mean of ',
     &      arrName, ' = ', theMean
       CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
     &      SQUEEZE_RIGHT , 1)
       _END_MASTER( myThid )
      ENDIF

C#endif /* ALLOW_BALANCE_FLUXES */
      RETURN
      END


CBOP C !ROUTINE: REMOVE_MEAN_RS C !INTERFACE: SUBROUTINE REMOVE_MEAN_RS( I myNr, arr, arrMask, arrhFac, arrArea, arrDr, I arrName, myTime, I myThid ) C !DESCRIPTION: \bv C /==========================================================\ C | SUBROUTINE REMOVE_MEAN_RS | C | o Calculate mean of global array "_RS arr" and substract | C | it from the array | C \==========================================================/ C \ev IMPLICIT NONE C === Global data === #include "SIZE.h" #include "EEPARAMS.h" #include "PARAMS.h" C === Functions ==== LOGICAL DIFFERENT_MULTIPLE EXTERNAL C === Routine arguments === INTEGER myNr _RS 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) CHARACTER*(*) arrName _RL myTime INTEGER myThid C#ifdef ALLOW_BALANCE_FLUXES C === Local variables ==== INTEGER bi,bj,I,J,K _RS tmpVal _RS theMean _RS theVol _RS tmpVol CHARACTER*(max_len_mbuf) msgbuf CEOP theMean=0. theVol=0. DO bj=myByLo(myThid),myByHi(myThid) DO bi=myBxLo(myThid),myBxHi(myThid) 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) theVol = theVol + tmpVol theMean = theMean + tmpVol*tmpVal ENDIF ENDDO ENDDO ENDDO ENDDO ENDDO _GLOBAL_SUM_RS(theVol,myThid) _GLOBAL_SUM_RS(theMean,myThid) IF (theVol.GT.0.) THEN theMean=theMean/theVol DO bj=myByLo(myThid),myByHi(myThid) DO bi=myBxLo(myThid),myBxHi(myThid) DO K=1,myNr DO J=1,sNy DO I=1,sNx IF (arrMask(I,J,K,bi,bj).NE.0.) THEN arr(I,J,K,bi,bj) = arr(I,J,K,bi,bj) - theMean ENDIF ENDDO ENDDO ENDDO ENDDO ENDDO ENDIF C Print the global mean to standard output, this is a measure for C the drift of the array arr IF ( balancePrintMean ) THEN _BEGIN_MASTER( myThid ) WRITE(msgbuf,'(a,a,a,e24.17)') & 'REMOVE_MEAN_RS: Global mean of ', & arrName, ' = ', theMean CALL PRINT_MESSAGE( msgBuf, standardMessageUnit, & SQUEEZE_RIGHT , 1) _END_MASTER( myThid ) ENDIF C#endif /* ALLOW_BALANCE_FLUXES */ RETURN END