C $Header: /u/gcmpack/MITgcm/pkg/longstep/longstep_average.F,v 1.6 2011/04/27 22:14:55 jmc Exp $ C $Name: $ #include "LONGSTEP_OPTIONS.h" CBOP C !ROUTINE: LONGSTEP_AVERAGE C !INTERFACE: SUBROUTINE LONGSTEP_AVERAGE( myTime, myIter, myThid ) C !DESCRIPTION: \bv C *==========================================================* C | SUBROUTINE LONGSTEP_AVERAGE C | o Average variables needed for longstep C | - myIter is used for determining the averaging interval C | (LS_nIter timesteps, phase 0) C *==========================================================* C \ev C !USES: IMPLICIT NONE C == Global variables === #include "SIZE.h" #include "EEPARAMS.h" #include "PARAMS.h" #include "GRID.h" #include "DYNVARS.h" #include "FFIELDS.h" #include "SURFACE.h" #include "LONGSTEP_PARAMS.h" #include "LONGSTEP.h" #ifdef ALLOW_GMREDI #include "GMREDI.h" #endif #ifdef ALLOW_KPP #include "KPP.h" #endif C !INPUT/OUTPUT PARAMETERS: C == Routine arguments == C myTime :: Current time in simulation C myIter :: Current iteration number in simulation C myThid :: my Thread Id number _RL myTime INTEGER myIter INTEGER myThid #ifdef ALLOW_LONGSTEP C !LOCAL VARIABLES: C == Local variables == CEOP C first iteration in a long time step? - reset averages IF ( MOD(myIter, LS_nIter) .EQ. 0 ) THEN CALL LONGSTEP_RESET_3D(LS_uVelCount, LS_uVel, Nr, myThid) CALL LONGSTEP_RESET_3D(LS_vVelCount, LS_vVel, Nr, myThid) CALL LONGSTEP_RESET_3D(LS_wVelCount, LS_wVel, Nr, myThid) CALL LONGSTEP_RESET_3D(LS_thetaCount,LS_theta,Nr, myThid) CALL LONGSTEP_RESET_3D(LS_saltCount, LS_salt, Nr, myThid) IF ( ivdc_kappa .NE. 0. _d 0 ) & CALL LONGSTEP_RESET_3D(LS_IVDConvCountCount, & LS_IVDConvCount, Nr, myThid) #ifdef SHORTWAVE_HEATING CALL LONGSTEP_RESET_3D(LS_QswCount, LS_Qsw, 1, myThid) #endif CALL LONGSTEP_RESET_3D(LS_fwFluxCount, LS_fwFlux, 1, myThid) #ifdef ALLOW_GMREDI IF ( useGMRedi ) THEN CALL LONGSTEP_RESET_3D(LS_KwxCount, LS_Kwx, Nr, myThid) CALL LONGSTEP_RESET_3D(LS_KwyCount, LS_Kwy, Nr, myThid) CALL LONGSTEP_RESET_3D(LS_KwzCount, LS_Kwz, Nr, myThid) ENDIF #endif #ifdef ALLOW_KPP IF ( useKPP ) THEN CALL LONGSTEP_RESET_3D(LS_KPPdiffKzSCount, & LS_KPPdiffKzS, Nr, myThid) CALL LONGSTEP_RESET_3D(LS_KPPghatCount, & LS_KPPghat, Nr, myThid) ENDIF #endif ENDIF C-- update average inside tile (no overlaps) for all bi,bj CALL LONGSTEP_FILL_3D_FAC(LS_uVelCount, LS_uVel, uVel, hFacW, & Nr, myThid) CALL LONGSTEP_FILL_3D_FAC(LS_vVelCount, LS_vVel, vVel, hFacS, & Nr, myThid) CALL LONGSTEP_FILL_3D(LS_wVelCount, LS_wVel, wVel, Nr, myThid) CALL LONGSTEP_FILL_3D(LS_thetaCount, LS_theta, theta, Nr, myThid) CALL LONGSTEP_FILL_3D(LS_saltCount, LS_salt, salt, Nr, myThid) IF ( ivdc_kappa .NE. 0. _d 0 ) & CALL LONGSTEP_FILL_3D(LS_IVDConvCountCount, & LS_IVDConvCount, IVDConvCount, Nr, myThid) #ifdef SHORTWAVE_HEATING CALL LONGSTEP_FILL_3D_RS(LS_QswCount, LS_Qsw, Qsw, 1, myThid) #endif IF ( LS_usePmEpR ) THEN CALL LONGSTEP_FILL_3D( LS_fwFluxCount,LS_fwFlux,PmEpR,1,myThid) ELSE CALL LONGSTEP_FILL_3D_RS(LS_fwFluxCount,LS_fwFlux,EmPmR,1,myThid) ENDIF #ifdef ALLOW_GMREDI IF ( useGMRedi ) THEN CALL LONGSTEP_FILL_3D(LS_KwxCount, LS_Kwx, Kwx, Nr, myThid) CALL LONGSTEP_FILL_3D(LS_KwyCount, LS_Kwy, Kwy, Nr, myThid) CALL LONGSTEP_FILL_3D(LS_KwzCount, LS_Kwz, Kwz, Nr, myThid) ENDIF #endif #ifdef ALLOW_KPP IF ( useKPP ) THEN CALL LONGSTEP_FILL_3D(LS_KPPdiffKzSCount, & LS_KPPdiffKzS, KPPdiffKzS, Nr, myThid) CALL LONGSTEP_FILL_3D(LS_KPPghatCount, & LS_KPPghat, KPPghat, Nr, myThid) ENDIF #endif C time for a ptracer time step? - finish average IF ( MOD(myIter, LS_nIter) .EQ. LS_nIter-1 ) THEN CALL LONGSTEP_AVERAGE_3D_FAC(LS_uVelCount, LS_uVel, hFacW, & Nr, myThid) CALL LONGSTEP_AVERAGE_3D_FAC(LS_vVelCount, LS_vVel, hFacS, & Nr, myThid) CALL LONGSTEP_AVERAGE_3D(LS_wVelCount, LS_wVel, Nr, myThid) CALL LONGSTEP_AVERAGE_3D(LS_thetaCount,LS_theta,Nr, myThid) CALL LONGSTEP_AVERAGE_3D(LS_saltCount, LS_salt, Nr, myThid) IF ( ivdc_kappa .NE. 0. _d 0 ) & CALL LONGSTEP_AVERAGE_3D(LS_IVDConvCountCount, & LS_IVDConvCount, Nr, myThid) #ifdef SHORTWAVE_HEATING CALL LONGSTEP_AVERAGE_3D(LS_QswCount, LS_Qsw, 1, myThid) #endif CALL LONGSTEP_AVERAGE_3D(LS_fwFluxCount, LS_fwFlux, 1, myThid) #ifdef ALLOW_GMREDI IF ( useGMRedi ) THEN CALL LONGSTEP_AVERAGE_3D(LS_KwxCount, LS_Kwx, Nr, myThid) CALL LONGSTEP_AVERAGE_3D(LS_KwyCount, LS_Kwy, Nr, myThid) CALL LONGSTEP_AVERAGE_3D(LS_KwzCount, LS_Kwz, Nr, myThid) ENDIF #endif #ifdef ALLOW_KPP IF ( useKPP ) THEN CALL LONGSTEP_AVERAGE_3D(LS_KPPdiffKzSCount, & LS_KPPdiffKzS, Nr, myThid) CALL LONGSTEP_AVERAGE_3D(LS_KPPghatCount, & LS_KPPghat, Nr, myThid) ENDIF #endif #if 0 C and update overlaps CALL EXCH_UV_3D_RL( LS_uVel, LS_vVel, .TRUE., Nr, myThid ) CALL EXCH_3D_RL( LS_wVel , Nr, myThid ) CALL EXCH_3D_RL( LS_theta, Nr, myThid ) CALL EXCH_3D_RL( LS_salt , Nr, myThid ) IF ( ivdc_kappa .NE. 0. _d 0 ) & CALL EXCH_3D_RL( LS_IVDConvCount, myThid ) #ifdef SHORTWAVE_HEATING CALL EXCH_XY_RL( LS_Qsw, myThid ) #endif CALL EXCH_XY_RL( LS_fwFlux, myThid ) #ifdef ALLOW_GMREDI IF ( useGMRedi ) THEN CALL EXCH_UV_AGRID_3D_RL( LS_Kwx, LS_Kwy, .FALSE., Nr, myThid ) CALL EXCH_3D_RL( LS_Kwz , Nr, myThid ) ENDIF #endif #ifdef ALLOW_KPP IF ( useKPP ) THEN CALL EXCH_3D_RL( LS_KPPdiffKzS, Nr, myThid ) CALL EXCH_3D_RL( LS_KPPghat, Nr, myThid ) ENDIF #endif #endif /* 0 */ #ifdef ALLOW_DIAGNOSTICS IF ( useDiagnostics ) THEN CALL DIAGNOSTICS_FILL(LS_uVel, 'LSuVel ',0,Nr,0,1,1,myThid) CALL DIAGNOSTICS_FILL(LS_vVel, 'LSvVel ',0,Nr,0,1,1,myThid) CALL DIAGNOSTICS_FILL(LS_wVel, 'LSwVel ',0,Nr,0,1,1,myThid) CALL DIAGNOSTICS_FILL(LS_theta,'LStheta ',0,Nr,0,1,1,myThid) CALL DIAGNOSTICS_FILL(LS_salt, 'LSsalt ',0,Nr,0,1,1,myThid) IF ( ivdc_kappa .NE. 0. _d 0 .AND. .NOT. useKPP ) & CALL DIAGNOSTICS_FILL(LS_IVDConvCount, & 'LScnvAdj',0,Nr,0,1,1,myThid) #ifdef SHORTWAVE_HEATING CALL DIAGNOSTICS_FILL(LS_Qsw , 'LSqsw ',0,1 ,0,1,1,myThid) #endif CALL DIAGNOSTICS_FILL(LS_fwFlux, 'LSfwFlux',0,1 ,0,1,1,myThid) #ifdef ALLOW_GMREDI IF ( useGMRedi ) THEN CALL DIAGNOSTICS_FILL(LS_Kwx , 'LSkwx ',0,Nr,0,1,1,myThid) CALL DIAGNOSTICS_FILL(LS_Kwy , 'LSkwy ',0,Nr,0,1,1,myThid) CALL DIAGNOSTICS_FILL(LS_Kwz , 'LSkwz ',0,Nr,0,1,1,myThid) ENDIF #endif #ifdef ALLOW_KPP IF ( useKPP ) THEN CALL DIAGNOSTICS_FILL(LS_KPPdiffKzs, & 'LSKPPdfS',0,Nr,0,1,1,myThid) CALL DIAGNOSTICS_FILL(LS_KPPghat, & 'LSKPPght',0,Nr,0,1,1,myThid) ENDIF #endif C if useDiagnostics: end ENDIF #endif /* ALLOW_DIAGNOSTICS */ _BARRIER _BEGIN_MASTER(myThid) C we decide whether to do a timestep here and everybody else just C checks this variable. This avoids complications with C staggerTimeStep LS_doTimeStep = .TRUE. _END_MASTER(myThid) _BARRIER ELSEIF ( MOD(myIter, LS_nIter) .EQ. 0 ) THEN C next time-step: switch back LS_doTimeStep _BARRIER _BEGIN_MASTER(myThid) LS_doTimeStep = .FALSE. _END_MASTER(myThid) _BARRIER C if MOD(myIter, LS_nIter): end ENDIF #endif /* ALLOW_LONGSTEP */ RETURN END