C $Header: /u/gcmpack/MITgcm/pkg/obcs/obcs_monitor.F,v 1.5 2012/09/17 22:06:17 jmc Exp $
C $Name:  $

#include "OBCS_OPTIONS.h"

C--  File obcs_monitor.F : write statistics of dynamical fields at OB section
C--   Contents
C--   o OBCS_MONITOR
C--   o OBCS_MON_WRITESTATS

C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
CBOP
C     !ROUTINE: OBCS_MONITOR

C     !INTERFACE:
      SUBROUTINE OBCS_MONITOR( myTime, myIter, myThid )

C     !DESCRIPTION:
C     *==========================================================*
C     | SUBROUTINE OBCS_MONITOR
C     | o Write out OB statistics
C     *==========================================================*

C     !USES:
      IMPLICIT NONE

C     === Global variables ===
#include "SIZE.h"
#include "EEPARAMS.h"
#include "PARAMS.h"
#include "GRID.h"
#include "DYNVARS.h"
#include "OBCS_PARAMS.h"
#include "OBCS_GRID.h"
#ifdef ALLOW_MONITOR
#include "MONITOR.h"
#endif

C     !INPUT/OUTPUT PARAMETERS:
      _RL myTime
      INTEGER myIter
      INTEGER myThid
CEOP

#ifdef ALLOW_OBCS
#ifdef ALLOW_MONITOR

C     !FUNCTIONS:
      LOGICAL  DIFFERENT_MULTIPLE
      EXTERNAL 
      LOGICAL  MASTER_CPU_IO
      EXTERNAL 

C     !LOCAL VARIABLES:
C     msgBuf       :: Informational/error message buffer
      CHARACTER*(MAX_LEN_MBUF) msgBuf
      _RL fldStats(0:4,4)

      IF ( DIFFERENT_MULTIPLE( OBCS_monitorFreq,myTime,deltaTClock )
     &   ) THEN

#ifdef ALLOW_DEBUG
      IF (debugMode) CALL DEBUG_ENTER('OBCS_MONITOR',myThid)
#endif

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

C--   OBCS monitor start
        IF ( MASTER_CPU_IO(myThid) ) THEN
C--   only the master thread is allowed to switch On/Off mon_write_stdout
C     & mon_write_mnc (since it is the only thread that uses those flags):

c         IF (monitor_stdio) THEN
            mon_write_stdout = .TRUE.
c         ELSE
c           mon_write_stdout = .FALSE.
c         ENDIF
          mon_write_mnc    = .FALSE.

          IF ( mon_write_stdout ) THEN
            WRITE(msgBuf,'(2A)') '// ==========================',
     &             '============================='
            CALL PRINT_MESSAGE( msgBuf, mon_ioUnit, SQUEEZE_RIGHT , 1)
            WRITE(msgBuf,'(A)')
     &             '// Begin OBCS MONITOR field statistics'
            CALL PRINT_MESSAGE( msgBuf, mon_ioUnit, SQUEEZE_RIGHT , 1)
            WRITE(msgBuf,'(2A)') '// ==========================',
     &             '============================='
            CALL PRINT_MESSAGE( msgBuf, mon_ioUnit, SQUEEZE_RIGHT , 1)
          ENDIF

C--   endif master cpu io
        ENDIF

        IF ( OBCS_monitorFreq .NE. monitorFreq
     &       .OR. .NOT.monitor_stdio ) THEN
         CALL MON_SET_PREF('obc_time_',myThid)
         CALL MON_OUT_I( 'tsnumber', myIter,mon_string_none,myThid)
         CALL MON_OUT_RL('secondsf', myTime,mon_string_none,myThid)
        ENDIF

        CALL MON_SET_PREF('obc_',myThid)

C--     Calculate and print Flow field Stats:
        IF ( OBCS_monSelect.GE.0 ) THEN

         CALL OBCS_MON_STATS_EW_RL(
     I             tileHasOBE, tileHasOBW,
     I             OB_Ie, OB_Iw, OB_indexNone,
     I             Nr, Nr, 1, uVel, hFacW, dyG, drF, maskInC,
     O             fldStats(0,1),
     I             myThid )
         CALL OBCS_MON_STATS_NS_RL(
     I             tileHasOBN, tileHasOBS,
     I             OB_Jn, OB_Js, OB_indexNone,
     I             Nr, Nr, 2, vVel, hFacS, dxG, drF, maskInC,
     O             fldStats(0,3),
     I             myThid )

         CALL OBCS_MON_WRITESTATS(
     I                             fldStats, 'Vel',
     I                             3, myIter, myThid )

        ENDIF

C--     Calculate and print Temp. field Stats:
        IF ( OBCS_monSelect.GE.1 ) THEN

         CALL OBCS_MON_STATS_EW_RL(
     I             tileHasOBE, tileHasOBW,
     I             OB_Ie, OB_Iw, OB_indexNone,
     I             Nr, Nr, 0, theta, hFacW, dyG, drF, maskInC,
     O             fldStats(0,1),
     I             myThid )
         CALL OBCS_MON_STATS_NS_RL(
     I             tileHasOBN, tileHasOBS,
     I             OB_Jn, OB_Js, OB_indexNone,
     I             Nr, Nr, 0, theta, hFacS, dxG, drF, maskInC,
     O             fldStats(0,3),
     I             myThid )

         CALL OBCS_MON_WRITESTATS(
     I                             fldStats, 'theta',
     I                             0, myIter, myThid )

        ENDIF

C--     Calculate and print Salt field Stats:
        IF ( OBCS_monSelect.GE.2 ) THEN

         CALL OBCS_MON_STATS_EW_RL(
     I             tileHasOBE, tileHasOBW,
     I             OB_Ie, OB_Iw, OB_indexNone,
     I             Nr, Nr, 0, salt, hFacW, dyG, drF, maskInC,
     O             fldStats(0,1),
     I             myThid )
         CALL OBCS_MON_STATS_NS_RL(
     I             tileHasOBN, tileHasOBS,
     I             OB_Jn, OB_Js, OB_indexNone,
     I             Nr, Nr, 0, salt, hFacS, dxG, drF, maskInC,
     O             fldStats(0,3),
     I             myThid )

         CALL OBCS_MON_WRITESTATS(
     I                             fldStats, 'salt',
     I                             0, myIter, myThid )

        ENDIF

C--   OBCS monitor finish
        IF ( MASTER_CPU_IO(myThid) ) THEN
C--   only the master thread is allowed to switch On/Off mon_write_stdout
C     & mon_write_mnc (since it is the only thread that uses those flags):

          IF ( mon_write_stdout ) THEN
            WRITE(msgBuf,'(2A)') '// ==========================',
     &             '============================='
            CALL PRINT_MESSAGE( msgBuf, mon_ioUnit, SQUEEZE_RIGHT , 1)
            WRITE(msgBuf,'(A)')
     &             '// End OBCS MONITOR field statistics'
            CALL PRINT_MESSAGE( msgBuf, mon_ioUnit, SQUEEZE_RIGHT , 1)
            WRITE(msgBuf,'(2A)') '// ==========================',
     &             '============================='
            CALL PRINT_MESSAGE( msgBuf, mon_ioUnit, SQUEEZE_RIGHT , 1)
          ENDIF

          mon_write_stdout = .FALSE.
          mon_write_mnc    = .FALSE.

C--   endif master cpu io
        ENDIF
C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|

#ifdef ALLOW_DEBUG
      IF (debugMode) CALL DEBUG_LEAVE('OBCS_MONITOR',myThid)
#endif

C     endif different multiple
      ENDIF

#endif /* ALLOW_MONITOR */
#endif /* ALLOW_OBCS */

      RETURN
      END


C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----| CBOP C !ROUTINE: OBCS_MON_WRITESTATS C !INTERFACE: SUBROUTINE OBCS_MON_WRITESTATS( I arrStats, arrName, I prtSelect, myIter, myThid ) C !DESCRIPTION: C *==========================================================* C | SUBROUTINE OBCS_MON_WRITESTATS C | o Write out OB statistics C *==========================================================* C !USES: IMPLICIT NONE C === Global variables === #include "SIZE.h" #include "EEPARAMS.h" #include "PARAMS.h" #ifdef ALLOW_MONITOR #include "MONITOR.h" #endif C !INPUT/OUTPUT PARAMETERS: _RL arrStats(0:4,4) CHARACTER*(*) arrName INTEGER prtSelect INTEGER myIter INTEGER myThid CEOP #ifdef ALLOW_OBCS #ifdef ALLOW_MONITOR C !LOCAL VARIABLES: C msgBuf :: Informational/error message buffer INTEGER j c CHARACTER*(MAX_LEN_MBUF) msgBuf CHARACTER*(12) fldName _RL theMin, theMax, theMean, theSD j = 1 fldName = 'E_'//arrName IF ( MOD(prtSelect,2).EQ.1 ) fldName = 'E_u'//arrName IF ( arrStats(0,j).GT.0. _d 0 ) THEN theMean= arrStats(1,j)/arrStats(0,j) theSD = arrStats(2,j)/arrStats(0,j) theSD = theSD - theMean*theMean IF ( theSD.GT.0. _d 0 ) theSD = SQRT(theSD) theMin = arrStats(3,j) theMax = arrStats(4,j) CALL MON_OUT_RL( fldName, theMax, mon_foot_max, myThid ) CALL MON_OUT_RL( fldName, theMin, mon_foot_min, myThid ) CALL MON_OUT_RL( fldName, theMean, mon_foot_mean, myThid ) CALL MON_OUT_RL( fldName, theSD, mon_foot_sd, myThid ) IF ( prtSelect.GE.2 ) & CALL MON_OUT_RL( fldName, arrStats(1,j), '_Int', myThid ) ENDIF j = 2 fldName = 'W_'//arrName IF ( MOD(prtSelect,2).EQ.1 ) fldName = 'W_u'//arrName IF ( arrStats(0,j).GT.0. _d 0 ) THEN theMean= arrStats(1,j)/arrStats(0,j) theSD = arrStats(2,j)/arrStats(0,j) theSD = theSD - theMean*theMean IF ( theSD.GT.0. _d 0 ) theSD = SQRT(theSD) theMin = arrStats(3,j) theMax = arrStats(4,j) CALL MON_OUT_RL( fldName, theMax, mon_foot_max, myThid ) CALL MON_OUT_RL( fldName, theMin, mon_foot_min, myThid ) CALL MON_OUT_RL( fldName, theMean, mon_foot_mean, myThid ) CALL MON_OUT_RL( fldName, theSD, mon_foot_sd, myThid ) IF ( prtSelect.GE.2 ) & CALL MON_OUT_RL( fldName, arrStats(1,j), '_Int', myThid ) ENDIF j = 3 fldName = 'N_'//arrName IF ( MOD(prtSelect,2).EQ.1 ) fldName = 'N_v'//arrName IF ( arrStats(0,j).GT.0. _d 0 ) THEN theMean= arrStats(1,j)/arrStats(0,j) theSD = arrStats(2,j)/arrStats(0,j) theSD = theSD - theMean*theMean IF ( theSD.GT.0. _d 0 ) theSD = SQRT(theSD) theMin = arrStats(3,j) theMax = arrStats(4,j) CALL MON_OUT_RL( fldName, theMax, mon_foot_max, myThid ) CALL MON_OUT_RL( fldName, theMin, mon_foot_min, myThid ) CALL MON_OUT_RL( fldName, theMean, mon_foot_mean, myThid ) CALL MON_OUT_RL( fldName, theSD, mon_foot_sd, myThid ) IF ( prtSelect.GE.2 ) & CALL MON_OUT_RL( fldName, arrStats(1,j), '_Int', myThid ) ENDIF j = 4 fldName = 'S_'//arrName IF ( MOD(prtSelect,2).EQ.1 ) fldName = 'S_v'//arrName IF ( arrStats(0,j).GT.0. _d 0 ) THEN theMean= arrStats(1,j)/arrStats(0,j) theSD = arrStats(2,j)/arrStats(0,j) theSD = theSD - theMean*theMean IF ( theSD.GT.0. _d 0 ) theSD = SQRT(theSD) theMin = arrStats(3,j) theMax = arrStats(4,j) CALL MON_OUT_RL( fldName, theMax, mon_foot_max, myThid ) CALL MON_OUT_RL( fldName, theMin, mon_foot_min, myThid ) CALL MON_OUT_RL( fldName, theMean, mon_foot_mean, myThid ) CALL MON_OUT_RL( fldName, theSD, mon_foot_sd, myThid ) IF ( prtSelect.GE.2 ) & CALL MON_OUT_RL( fldName, arrStats(1,j), '_Int', myThid ) ENDIF #endif /* ALLOW_MONITOR */ #endif /* ALLOW_OBCS */ RETURN END