C $Header: /u/gcmpack/MITgcm/pkg/timeave/timeave_statvars.F,v 1.27 2012/08/06 16:56:59 jmc Exp $ C $Name: $ #include "TIMEAVE_OPTIONS.h" CBOP C !ROUTINE: TIMEAVE_STATV_WRITE C !INTERFACE: SUBROUTINE TIMEAVE_STATVARS( I myTime, myIter, bi, bj, myThid ) C !DESCRIPTION: C *==========================================================* C | SUBROUTINE TIMEAVE_STATVARS C | o Time averaging routine for eta, U, V, W, T, S, UT, VT C | in model main time-stepping C *==========================================================* C !USES: IMPLICIT NONE C == Global variables === #include "SIZE.h" #include "EEPARAMS.h" #include "PARAMS.h" #include "DYNVARS.h" #include "GRID.h" #include "TIMEAVE_STATV.h" C !INPUT PARAMETERS: C == Routine arguments == C myTime :: Current time of simulation ( s ) C myIter :: Iteration number C myThid :: Thread number for this instance of the routine. _RL myTime INTEGER myIter, bi, bj INTEGER myThid CEOP #ifdef ALLOW_TIMEAVE C !FUNCTIONS: LOGICAL DIFFERENT_MULTIPLE EXTERNAL C !LOCAL VARIABLES: LOGICAL dumpFiles _RL DDTT C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----| C- Initialize fields for the first call ever IF ( myIter .EQ. nIter0 ) THEN CALL TIMEAVE_RESET(uFluxtave, 1, bi, bj, myThid) CALL TIMEAVE_RESET(vFluxtave, 1, bi, bj, myThid) CALL TIMEAVE_RESET(tFluxtave, 1, bi, bj, myThid) CALL TIMEAVE_RESET(sFluxtave, 1, bi, bj, myThid) CALL TIMEAVE_RESET(etatave, 1, bi, bj, myThid) CALL TIMEAVE_RESET(thetatave, Nr, bi, bj, myThid) CALL TIMEAVE_RESET(salttave, Nr, bi, bj, myThid) CALL TIMEAVE_RESET(uVeltave, Nr, bi, bj, myThid) CALL TIMEAVE_RESET(vVeltave, Nr, bi, bj, myThid) CALL TIMEAVE_RESET(wVeltave, Nr, bi, bj, myThid) CALL TIMEAVE_RESET(phiHydLowtave,1, bi, bj, myThid) CALL TIMEAVE_RESET(UTtave, Nr, bi, bj, myThid) CALL TIMEAVE_RESET(VTtave, Nr, bi, bj, myThid) CALL TIMEAVE_RESET(WTtave, Nr, bi, bj, myThid) CALL TIMEAVE_RESET(UStave, Nr, bi, bj, myThid) CALL TIMEAVE_RESET(VStave, Nr, bi, bj, myThid) CALL TIMEAVE_RESET(WStave, Nr, bi, bj, myThid) CALL TIMEAVE_RESET(Eta2tave, 1, bi, bj, myThid) CALL TIMEAVE_RESET(TTtave, Nr, bi, bj, myThid) CALL TIMEAVE_RESET(UUtave, Nr, bi, bj, myThid) CALL TIMEAVE_RESET(VVtave, Nr, bi, bj, myThid) CALL TIMEAVE_RESET(UVtave, Nr, bi, bj, myThid) c CALL TIMEAVE_RESET(KEtave, Nr, bi, bj, myThid) CALL TIMEAVE_RESET(TdiffRtave,Nr, bi, bj, myThid) #ifdef ALLOW_MOM_VECINV CALL TIMEAVE_RESET(uZetatave, Nr, bi, bj, myThid) CALL TIMEAVE_RESET(vZetatave, Nr, bi, bj, myThid) #endif CALL TIMEAVE_RESET(phiHydtave,Nr, bi, bj, myThid) CALL TIMEAVE_RESET(phiHydLow2Tave,1, bi, bj, myThid) CALL TIMEAVE_RESET(ConvectCountTave,Nr,bi,bj,myThid) #ifdef NONLIN_FRSURF CALL TIMEAVE_RESET(hUtave, Nr, bi, bj, myThid) CALL TIMEAVE_RESET(hVtave, Nr, bi, bj, myThid) c CALL TIMEAVE_RESET(hFacCtave, Nr, bi, bj, myThid) c CALL TIMEAVE_RESET(hFacWtave, Nr, bi, bj, myThid) c CALL TIMEAVE_RESET(hFacStave, Nr, bi, bj, myThid) #endif /* NONLIN_FRSURF */ timeAve_half(bi,bj) = 0. _d 0 timeAve_full(bi,bj) = 0. _d 0 ENDIF C-- Cumulate state-variables with Half or Full time step : IF ( myIter .EQ. nIter0 ) THEN DDTT = deltaTclock*(1. _d 0 - tave_lastIter) ELSE DDTT = deltaTclock dumpFiles = DIFFERENT_MULTIPLE(taveFreq,myTime,deltaTClock) #ifdef ALLOW_CAL IF ( useCAL ) THEN CALL CAL_TIME2DUMP( zeroRL, taveFreq, deltaTClock, U dumpFiles, I myTime, myIter, myThid ) ENDIF #endif /* ALLOW_CAL */ IF ( dumpFiles ) DDTT = deltaTclock*tave_lastIter ENDIF IF ( DDTT .NE. 0. _d 0) THEN C- Time Averages of single fields (no hFactor) CALL TIMEAVE_CUMULATE(etatave, etaN, 1 , DDTT, bi, bj, myThid) CALL TIMEAVE_CUMULATE(thetatave,theta, Nr, DDTT, bi, bj, myThid) CALL TIMEAVE_CUMULATE(salttave, salt, Nr, DDTT, bi, bj, myThid) CALL TIMEAVE_CUMULATE(uVeltave, uVel, Nr, DDTT, bi, bj, myThid) CALL TIMEAVE_CUMULATE(vVeltave, vVel, Nr, DDTT, bi, bj, myThid) CALL TIMEAVE_CUMULATE(wVeltave, wVel, Nr, DDTT, bi, bj, myThid) C- Time Averages of "double" fields (no hFactor) CALL TIMEAVE_CUMUL_2V(Eta2tave, etaN,etaN, 1, 0, & DDTT, bi, bj, myThid) CALL TIMEAVE_CUMUL_2V(TTtave, theta,theta, Nr, 0, & DDTT, bi, bj, myThid) CALL TIMEAVE_CUMUL_2V(UUtave, uVel, uVel, Nr, 0, & DDTT, bi, bj, myThid) CALL TIMEAVE_CUMUL_2V(VVtave, vVel, vVel, Nr, 0, & DDTT, bi, bj, myThid) CALL TIMEAVE_CUMUL_2V(UVtave, uVel, vVel, Nr, 12, & DDTT, bi, bj, myThid) c CALL TIMEAVE_CUMUL_KE(KEtave, uVel, vVel, Nr, c & DDTT, bi, bj, myThid) CALL TIMEAVE_CUMUL_2V(WTtave, theta, wVel, Nr, 3, & DDTT, bi, bj, myThid) CALL TIMEAVE_CUMUL_2V(WStave, salt, wVel, Nr, 3, & DDTT, bi, bj, myThid) #ifdef NONLIN_FRSURF c CALL TIMEAVE_CUMUL_FC(hFacCtave,hFacC, Nr, DDTT, bi, bj, myThid) c CALL TIMEAVE_CUMUL_FC(hFacWtave,hFacW, Nr, DDTT, bi, bj, myThid) c CALL TIMEAVE_CUMUL_FC(hFacStave,hFacS, Nr, DDTT, bi, bj, myThid) C- Time Averages of single fields (* hFactor) CALL TIMEAVE_CUMUL_1VFC(hUtave, uVel, hFacW, Nr, & DDTT, bi, bj, myThid) CALL TIMEAVE_CUMUL_1VFC(hVtave, vVel, hFacS, Nr, & DDTT, bi, bj, myThid) #endif /* NONLIN_FRSURF */ C- Time Averages of "double" fields (* hFactor) CALL TIMEAVE_CUMUL_2VFC(UTtave, theta, uVel, hFacW, Nr, 1, & DDTT, bi, bj, myThid) CALL TIMEAVE_CUMUL_2VFC(VTtave, theta, vVel, hFacS, Nr, 2, & DDTT, bi, bj, myThid) CALL TIMEAVE_CUMUL_2VFC(UStave, salt, uVel, hFacW, Nr, 1, & DDTT, bi, bj, myThid) CALL TIMEAVE_CUMUL_2VFC(VStave, salt, vVel, hFacS, Nr, 2, & DDTT, bi, bj, myThid) C- Time Averages of "double" fields (no hFactor) c CALL TIMEAVE_CUMUL_2V(UTtave, theta, uVel, Nr, 1, c & DDTT, bi, bj, myThid) c CALL TIMEAVE_CUMUL_2V(VTtave, theta, vVel, Nr, 2, c & DDTT, bi, bj, myThid) c CALL TIMEAVE_CUMUL_2V(UStave, salt, uVel, Nr, 1, c & DDTT, bi, bj, myThid) c CALL TIMEAVE_CUMUL_2V(VStave, salt, vVel, Nr, 2, c & DDTT, bi, bj, myThid) C- Keep record of how much time has been integrated over timeAve_half(bi,bj) = timeAve_half(bi,bj)+DDTT C-- end if DDTT ... ENDIF C- Time Averages of "intermediate" fields (no hFactor) IF ( myIter .NE. nIter0 ) THEN C- Time Averages of surface fluxes C <- moved to external_forcing_surf CALL TIMEAVE_CUMULATE(phiHydLowtave, phiHydLow, 1, & deltaTclock, bi, bj, myThid) CALL TIMEAVE_CUMULATE(phiHydtave, totPhihyd, Nr, & deltaTclock, bi, bj, myThid) CALL TIMEAVE_CUMUL_2V(phiHydLow2Tave, & phiHydLow,phiHydLow, 1, 0, deltaTclock, bi, bj, myThid) timeAve_full(bi,bj) = timeAve_full(bi,bj)+deltaTclock ENDIF #endif /* ALLOW_TIMEAVE */ RETURN END