C $Header: /u/gcmpack/MITgcm/pkg/sbo/sbo_output.F,v 1.2 2010/01/03 20:03:36 jmc Exp $
C $Name: $
#include "SBO_OPTIONS.h"
SUBROUTINE SBO_OUTPUT( myTime, myIter, myThid )
C *==========================================================*
C | SUBROUTINE SBO_OUTPUT
C | o Do SBO diagnostic output.
C *==========================================================*
IMPLICIT NONE
C === Global variables ===
#include "SIZE.h"
#include "EEPARAMS.h"
#include "PARAMS.h"
#include "SBO.h"
C == Routine arguments ==
C myTime :: my time in simulation ( s )
C myIter :: my Iteration number
C myThid :: my Thread Id number
_RL myTime
INTEGER myIter
INTEGER myThid
#ifdef ALLOW_SBO
c == Local variables ==
c bi, bj - loop counters
c sbo_diag - vector of SBO diagnostics contains:
c model time (s), xoamc, yoamc, zoamc,
c xoamp, yoamp, zoamp, mass, xcom, ycom, zcom
c character*(8) fName
CHARACTER*(MAX_LEN_FNAM) fName
INTEGER narr
PARAMETER( narr = 15 )
INTEGER irecord
c Real*8 sbo_diag(15)
INTEGER ioUnit
_RL sbo_diag(narr)
_RS dummyRS(1)
#ifdef ALLOW_TIMEAVE
INTEGER bi, bj
LOGICAL DIFFERENT_MULTIPLE
EXTERNAL
_RL DDTT
CHARACTER*(MAX_LEN_MBUF) suff
#endif
C-----------------------------------------------------------------
C Save angular momentum and mass variables at every time step
C-----------------------------------------------------------------
sbo_diag(1) = myTime
sbo_diag(2) = xoamc
sbo_diag(3) = yoamc
sbo_diag(4) = zoamc
sbo_diag(5) = xoamp
sbo_diag(6) = yoamp
sbo_diag(7) = zoamp
sbo_diag(8) = mass
sbo_diag(9) = xcom
sbo_diag(10) = ycom
sbo_diag(11) = zcom
sbo_diag(12) = sboarea
sbo_diag(13) = sbobp
sbo_diag(14) = sboempmrwet
sbo_diag(15) = sboqnetwet
irecord = myIter - nIter0 + 1
c fName = 'SBO_DIAG'
c CALL SBO_WRITEVECTOR(
c I fName,
c I narr,
c I sbo_diag,
c I irecord,
c I myIter,
c I myThid )
#ifdef ALLOW_MDSIO
IF ( nThreads.EQ.1 ) THEN
C- multi-threaded: avoid writing wrong results
C (due to Pb with GLOBAL_SUM in sbo_calc.F, cf comments there)
WRITE(fName,'(A,I10.10)') 'SBO_global.', nIter0
ioUnit = 0
CALL MDS_WRITEVEC_LOC(
I fName, precFloat64, ioUnit,
I 'RL', narr, sbo_diag, dummyRS,
I 0, 0, irecord, myIter, myThid )
ENDIF
#endif /* ALLOW_MDSIO */
#ifdef ALLOW_TIMEAVE
IF ( sbo_taveFreq.GT.0. _d 0 ) THEN
C-----------------------------------------------------------------
C Save time-averaged bottom pressure at sbo_taveFreq intervals
C-----------------------------------------------------------------
C Initialize averages to zero
IF ( myIter.EQ.nIter0 ) THEN
DO bj = myByLo(myThid), myByHi(myThid)
DO bi = myBxLo(myThid), myBxHi(myThid)
CALL TIMEAVE_RESET( OBPtave, 1, bi, bj, myThid )
sbo_timeAve(bi,bj) = 0.
ENDDO
ENDDO
ENDIF
C Time Average SBO fields
IF ( myIter .EQ. nIter0 .OR.
& DIFFERENT_MULTIPLE(sbo_taveFreq,myTime,deltaTClock)
& ) THEN
DDTT=0.5*deltaTclock
ELSE
DDTT=deltaTclock
ENDIF
DO bj = myByLo(myThid), myByHi(myThid)
DO bi = myBxLo(myThid), myBxHi(myThid)
CALL TIMEAVE_CUMULATE( OBPtave, obp, 1, DDTT, bi,bj,myThid )
C Keep record of how much time has been integrated over
sbo_timeAve(bi,bj) = sbo_timeAve(bi,bj)+DDTT
ENDDO
ENDDO
C Dump files and restart average computation if needed
IF ( myIter.NE.nIter0 .AND.
& DIFFERENT_MULTIPLE(sbo_taveFreq,myTime,deltaTClock)
& ) THEN
C Normalize by integrated time
DO bj = myByLo(myThid), myByHi(myThid)
DO bi = myBxLo(myThid), myBxHi(myThid)
CALL TIMEAVE_NORMALIZE(OBPtave,sbo_timeAve,1,bi,bj,myThid)
ENDDO
ENDDO
WRITE(suff,'(I10.10)') myIter
CALL WRITE_FLD_XY_RL( 'OBPtave.', suff,
& OBPtave, myIter, myThid )
C Reset averages to zero
DO bj = myByLo(myThid), myByHi(myThid)
DO bi = myBxLo(myThid), myBxHi(myThid)
CALL TIMEAVE_RESET( OBPtave, 1, bi, bj, myThid )
sbo_timeAve(bi,bj) = 0.
ENDDO
ENDDO
C Time Average SBO fields
DDTT=0.5*deltaTclock
DO bj = myByLo(myThid), myByHi(myThid)
DO bi = myBxLo(myThid), myBxHi(myThid)
CALL TIMEAVE_CUMULATE( OBPtave, obp, 1, DDTT,bi,bj,myThid )
C Keep record of how much time has been integrated over
sbo_timeAve(bi,bj) = sbo_timeAve(bi,bj)+DDTT
ENDDO
ENDDO
C-- end dump-files block
ENDIF
C- end if sbo_taveFreq > 0
ENDIF
#endif /* ALLOW_TIMEAVE */
#endif /* ALLOW_SBO */
RETURN
END