C $Header: /home/ubuntu/mnt/e9_copy/MITgcm/pkg/timeave/timeave_statvars.F,v 1.10 2003/10/23 07:14:49 dimitri Exp $ C $Name: $ #include "TIMEAVE_OPTIONS.h" SUBROUTINE TIMEAVE_STATVARS( I myTime, myIter, bi, bj, myThid) 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 \==========================================================/ IMPLICIT NONE C == Global variables === #include "SIZE.h" #include "EEPARAMS.h" #include "PARAMS.h" #include "DYNVARS.h" #include "GRID.h" #include "FFIELDS.h" #include "TIMEAVE_STATV.h" LOGICAL DIFFERENT_MULTIPLE EXTERNAL DIFFERENT_MULTIPLE C == Routine arguments == C myThid - Thread number for this instance of the routine. C myIter - Iteration number C myTime - Current time of simulation ( s ) INTEGER myThid INTEGER myIter, bi, bj _RL myTime #ifdef ALLOW_TIMEAVE C == Local variables == INTEGER I, J, K _RL DDTT _RL tempArray (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy) 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(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(UTtave, Nr, bi, bj, myThid) CALL TIMEAVE_RESET(VTtave, Nr, bi, bj, myThid) CALL TIMEAVE_RESET(WTtave, Nr, bi, bj, myThid) CALL TIMEAVE_RESET(TdiffRtave,Nr, bi, bj, myThid) #ifndef DISABLE_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(phiHydLowtave,1, 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 */ DO K=1,Nr TimeAve_half(k,bi,bj)=0. TimeAve_full(k,bi,bj)=0. ENDDO ENDIF C-- Cumulate state-variables with Half or Full time step : IF ( myIter .EQ. nIter0 ) THEN DDTT = deltaTclock*(1. _d 0 - tave_lastIter) ELSEIF ( & DIFFERENT_MULTIPLE(taveFreq, myTime, myTime-deltaTClock)) THEN DDTT = deltaTclock*tave_lastIter ELSE DDTT = deltaTclock ENDIF IF ( DDTT .NE. 0. _d 0) THEN C- Time Averages of surface fluxes IF ( buoyancyRelation .EQ. 'OCEANICP' ) THEN k=Nr ELSE k=1 ENDIF C uFlux DO j=1,sNy DO i=1,sNx tempArray(i,j,bi,bj)=fu(i,j,bi,bj)*foFacMom*_maskW(i,j,k,bi,bj) ENDDO ENDDO CALL TIMEAVE_CUMULATE(uFluxtave,tempArray,1,DDTT,bi,bj,myThid) C vFlux DO j=1,sNy DO i=1,sNx tempArray(i,j,bi,bj)=fv(i,j,bi,bj)*foFacMom*_maskS(i,j,k,bi,bj) ENDDO ENDDO CALL TIMEAVE_CUMULATE(vFluxtave,tempArray,1,DDTT,bi,bj,myThid) C tFlux DO j=1,sNy DO i=1,sNx tempArray(i,j,bi,bj)=maskC(i,j,k,bi,bj)*( #ifdef SHORTWAVE_HEATING & -Qsw(i,j,bi,bj)+ #endif & (surfaceTendencyT(i,j,bi,bj)+surfaceTendencyTice(I,J,bi,bj))* & HeatCapacity_Cp* & recip_horiVertRatio*rhoConst*drF(k)*hFacC(i,j,k,bi,bj)) ENDDO ENDDO CALL TIMEAVE_CUMULATE(tFluxtave,tempArray,1,DDTT,bi, bj, myThid) C sFlux DO j=1,sNy DO i=1,sNx tempArray(i,j,bi,bj)=maskC(i,j,k,bi,bj)* & surfaceTendencyS(i,j,bi,bj)* & recip_horiVertRatio*rhoConst*drF(k)*hFacC(i,j,k,bi,bj) ENDDO ENDDO CALL TIMEAVE_CUMULATE(sFluxtave,tempArray,1,DDTT,bi,bj,myThid) 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) #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) 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- Keep record of how much time has been integrated over DO K=1,Nr TimeAve_half(k,bi,bj)=TimeAve_half(k,bi,bj)+DDTT ENDDO C-- end if DDTT ... ENDIF C- Time Averages of "intermediate" fields (no hFactor) IF ( myIter .NE. nIter0 ) THEN CALL TIMEAVE_CUMULATE(phiHydtave, totPhihyd, Nr, & deltaTclock, bi, bj, myThid) CALL TIMEAVE_CUMULATE(phiHydLowtave, phiHydLow, 1, & deltaTclock, bi, bj, myThid) CALL TIMEAVE_CUMUL_2V(phiHydLow2Tave, & phiHydLow,phiHydLow, 1, 0, deltaTclock, bi, bj, myThid) DO K=1,Nr TimeAve_full(k,bi,bj)=TimeAve_full(k,bi,bj)+deltaTclock ENDDO ENDIF #endif /* ALLOW_TIMEAVE */ RETURN END