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