Back to home page

MITgcm

 
 

    


File indexing completed on 2018-03-02 18:41:46 UTC

view on githubraw file Latest commit add29e06 on 2018-01-31 20:35:05 UTC
4e66ab0b67 Oliv*0001 #include "LONGSTEP_OPTIONS.h"
                0002 
                0003 CBOP
                0004 C     !ROUTINE: LONGSTEP_AVERAGE
                0005 C     !INTERFACE:
                0006       SUBROUTINE LONGSTEP_AVERAGE( myTime, myIter, myThid )
                0007 
                0008 C     !DESCRIPTION: \bv
                0009 C     *==========================================================*
                0010 C     | SUBROUTINE LONGSTEP_AVERAGE
                0011 C     | o Average variables needed for longstep
                0012 C     |   - myIter is used for determining the averaging interval
                0013 C     |     (LS_nIter timesteps, phase 0)
                0014 C     *==========================================================*
                0015 C     \ev
                0016 
                0017 C     !USES:
                0018       IMPLICIT NONE
                0019 C     == Global variables ===
                0020 #include "SIZE.h"
                0021 #include "EEPARAMS.h"
                0022 #include "PARAMS.h"
fda3710353 Oliv*0023 #include "GRID.h"
4e66ab0b67 Oliv*0024 #include "DYNVARS.h"
                0025 #include "FFIELDS.h"
fda3710353 Oliv*0026 #include "SURFACE.h"
4e66ab0b67 Oliv*0027 #include "LONGSTEP_PARAMS.h"
                0028 #include "LONGSTEP.h"
                0029 #ifdef ALLOW_GMREDI
                0030 #include "GMREDI.h"
                0031 #endif
                0032 #ifdef ALLOW_KPP
                0033 #include "KPP.h"
                0034 #endif
                0035 
                0036 C     !INPUT/OUTPUT PARAMETERS:
                0037 C     == Routine arguments ==
                0038 C     myTime     :: Current time in simulation
                0039 C     myIter     :: Current iteration number in simulation
                0040 C     myThid     :: my Thread Id number
03ff461a6c Jean*0041       _RL     myTime
4e66ab0b67 Oliv*0042       INTEGER myIter
                0043       INTEGER myThid
                0044 
                0045 #ifdef ALLOW_LONGSTEP
                0046 C     !LOCAL VARIABLES:
                0047 C     == Local variables ==
                0048 CEOP
                0049 
                0050 C     first iteration in a long time step? - reset averages
7b3defa94d Jean*0051       IF ( MOD(myIter, LS_nIter) .EQ. 0 ) THEN
4e66ab0b67 Oliv*0052 
                0053        CALL LONGSTEP_RESET_3D(LS_uVelCount, LS_uVel, Nr, myThid)
                0054        CALL LONGSTEP_RESET_3D(LS_vVelCount, LS_vVel, Nr, myThid)
                0055        CALL LONGSTEP_RESET_3D(LS_wVelCount, LS_wVel, Nr, myThid)
                0056        CALL LONGSTEP_RESET_3D(LS_thetaCount,LS_theta,Nr, myThid)
                0057        CALL LONGSTEP_RESET_3D(LS_saltCount, LS_salt, Nr, myThid)
                0058        IF ( ivdc_kappa .NE. 0. _d 0 )
                0059      &  CALL LONGSTEP_RESET_3D(LS_IVDConvCountCount,
                0060      &                        LS_IVDConvCount, Nr, myThid)
                0061 #ifdef SHORTWAVE_HEATING
                0062        CALL LONGSTEP_RESET_3D(LS_QswCount, LS_Qsw, 1, myThid)
                0063 #endif
fda3710353 Oliv*0064        CALL LONGSTEP_RESET_3D(LS_fwFluxCount, LS_fwFlux, 1, myThid)
4e66ab0b67 Oliv*0065 #ifdef ALLOW_GMREDI
                0066        IF ( useGMRedi ) THEN
                0067         CALL LONGSTEP_RESET_3D(LS_KwxCount, LS_Kwx, Nr, myThid)
                0068         CALL LONGSTEP_RESET_3D(LS_KwyCount, LS_Kwy, Nr, myThid)
                0069         CALL LONGSTEP_RESET_3D(LS_KwzCount, LS_Kwz, Nr, myThid)
                0070        ENDIF
                0071 #endif
                0072 #ifdef ALLOW_KPP
                0073        IF ( useKPP ) THEN
                0074         CALL LONGSTEP_RESET_3D(LS_KPPdiffKzSCount,
                0075      &                         LS_KPPdiffKzS, Nr, myThid)
                0076         CALL LONGSTEP_RESET_3D(LS_KPPghatCount,
                0077      &                         LS_KPPghat, Nr, myThid)
                0078        ENDIF
                0079 #endif
                0080 
                0081       ENDIF
                0082 
                0083 C--   update average inside tile (no overlaps) for all bi,bj
                0084 
fda3710353 Oliv*0085       CALL LONGSTEP_FILL_3D_FAC(LS_uVelCount, LS_uVel, uVel, hFacW,
                0086      &                          Nr, myThid)
                0087       CALL LONGSTEP_FILL_3D_FAC(LS_vVelCount, LS_vVel, vVel, hFacS,
                0088      &                          Nr, myThid)
4e66ab0b67 Oliv*0089       CALL LONGSTEP_FILL_3D(LS_wVelCount, LS_wVel, wVel, Nr, myThid)
                0090       CALL LONGSTEP_FILL_3D(LS_thetaCount, LS_theta, theta, Nr, myThid)
                0091       CALL LONGSTEP_FILL_3D(LS_saltCount, LS_salt, salt, Nr, myThid)
                0092       IF ( ivdc_kappa .NE. 0. _d 0 )
                0093      & CALL LONGSTEP_FILL_3D(LS_IVDConvCountCount,
                0094      &                      LS_IVDConvCount, IVDConvCount, Nr, myThid)
                0095 #ifdef SHORTWAVE_HEATING
0af7e34ef5 Oliv*0096       CALL LONGSTEP_FILL_3D_RS(LS_QswCount, LS_Qsw, Qsw, 1, myThid)
4e66ab0b67 Oliv*0097 #endif
fda3710353 Oliv*0098       IF ( LS_usePmEpR ) THEN
5e3924b243 Jean*0099        CALL LONGSTEP_FILL_3D(   LS_fwFluxCount,LS_fwFlux,PmEpR,1,myThid)
fda3710353 Oliv*0100       ELSE
                0101        CALL LONGSTEP_FILL_3D_RS(LS_fwFluxCount,LS_fwFlux,EmPmR,1,myThid)
                0102       ENDIF
4e66ab0b67 Oliv*0103 #ifdef ALLOW_GMREDI
                0104       IF ( useGMRedi ) THEN
                0105        CALL LONGSTEP_FILL_3D(LS_KwxCount, LS_Kwx, Kwx, Nr, myThid)
                0106        CALL LONGSTEP_FILL_3D(LS_KwyCount, LS_Kwy, Kwy, Nr, myThid)
                0107        CALL LONGSTEP_FILL_3D(LS_KwzCount, LS_Kwz, Kwz, Nr, myThid)
                0108       ENDIF
                0109 #endif
                0110 #ifdef ALLOW_KPP
                0111       IF ( useKPP ) THEN
                0112        CALL LONGSTEP_FILL_3D(LS_KPPdiffKzSCount,
                0113      &                       LS_KPPdiffKzS, KPPdiffKzS, Nr, myThid)
                0114        CALL LONGSTEP_FILL_3D(LS_KPPghatCount,
                0115      &                       LS_KPPghat, KPPghat, Nr, myThid)
                0116       ENDIF
                0117 #endif
                0118 
                0119 C     time for a ptracer time step? - finish average
7b3defa94d Jean*0120       IF ( MOD(myIter, LS_nIter) .EQ. LS_nIter-1 ) THEN
4e66ab0b67 Oliv*0121 
fda3710353 Oliv*0122        CALL LONGSTEP_AVERAGE_3D_FAC(LS_uVelCount, LS_uVel, hFacW,
                0123      &                              Nr, myThid)
                0124        CALL LONGSTEP_AVERAGE_3D_FAC(LS_vVelCount, LS_vVel, hFacS,
                0125      &                              Nr, myThid)
4e66ab0b67 Oliv*0126        CALL LONGSTEP_AVERAGE_3D(LS_wVelCount, LS_wVel, Nr, myThid)
                0127        CALL LONGSTEP_AVERAGE_3D(LS_thetaCount,LS_theta,Nr, myThid)
                0128        CALL LONGSTEP_AVERAGE_3D(LS_saltCount, LS_salt, Nr, myThid)
                0129        IF ( ivdc_kappa .NE. 0. _d 0 )
                0130      &  CALL LONGSTEP_AVERAGE_3D(LS_IVDConvCountCount,
                0131      &                        LS_IVDConvCount, Nr, myThid)
                0132 #ifdef SHORTWAVE_HEATING
                0133        CALL LONGSTEP_AVERAGE_3D(LS_QswCount, LS_Qsw, 1, myThid)
                0134 #endif
fda3710353 Oliv*0135        CALL LONGSTEP_AVERAGE_3D(LS_fwFluxCount, LS_fwFlux, 1, myThid)
                0136 
4e66ab0b67 Oliv*0137 #ifdef ALLOW_GMREDI
                0138        IF ( useGMRedi ) THEN
                0139         CALL LONGSTEP_AVERAGE_3D(LS_KwxCount, LS_Kwx, Nr, myThid)
                0140         CALL LONGSTEP_AVERAGE_3D(LS_KwyCount, LS_Kwy, Nr, myThid)
                0141         CALL LONGSTEP_AVERAGE_3D(LS_KwzCount, LS_Kwz, Nr, myThid)
                0142        ENDIF
                0143 #endif
                0144 #ifdef ALLOW_KPP
                0145        IF ( useKPP ) THEN
                0146         CALL LONGSTEP_AVERAGE_3D(LS_KPPdiffKzSCount,
                0147      &                           LS_KPPdiffKzS, Nr, myThid)
                0148         CALL LONGSTEP_AVERAGE_3D(LS_KPPghatCount,
                0149      &                           LS_KPPghat, Nr, myThid)
                0150        ENDIF
                0151 #endif
                0152 
                0153 #if 0
                0154 C     and update overlaps
                0155        CALL EXCH_UV_3D_RL( LS_uVel, LS_vVel, .TRUE., Nr, myThid )
                0156        CALL EXCH_3D_RL( LS_wVel , Nr, myThid )
                0157        CALL EXCH_3D_RL( LS_theta, Nr, myThid )
                0158        CALL EXCH_3D_RL( LS_salt , Nr, myThid )
                0159        IF ( ivdc_kappa .NE. 0. _d 0 )
                0160      &  CALL EXCH_3D_RL( LS_IVDConvCount, myThid )
                0161 #ifdef SHORTWAVE_HEATING
                0162        CALL EXCH_XY_RL( LS_Qsw, myThid )
                0163 #endif
fda3710353 Oliv*0164        CALL EXCH_XY_RL( LS_fwFlux, myThid )
4e66ab0b67 Oliv*0165 #ifdef ALLOW_GMREDI
                0166        IF ( useGMRedi ) THEN
                0167         CALL EXCH_UV_AGRID_3D_RL( LS_Kwx, LS_Kwy, .FALSE., Nr, myThid )
                0168         CALL EXCH_3D_RL( LS_Kwz  , Nr, myThid )
                0169        ENDIF
                0170 #endif
                0171 #ifdef ALLOW_KPP
                0172        IF ( useKPP ) THEN
                0173         CALL EXCH_3D_RL( LS_KPPdiffKzS, Nr, myThid )
                0174         CALL EXCH_3D_RL( LS_KPPghat, Nr, myThid )
                0175        ENDIF
                0176 #endif
                0177 #endif /* 0 */
                0178 
                0179 #ifdef ALLOW_DIAGNOSTICS
                0180        IF ( useDiagnostics ) THEN
                0181         CALL DIAGNOSTICS_FILL(LS_uVel, 'LSuVel  ',0,Nr,0,1,1,myThid)
                0182         CALL DIAGNOSTICS_FILL(LS_vVel, 'LSvVel  ',0,Nr,0,1,1,myThid)
                0183         CALL DIAGNOSTICS_FILL(LS_wVel, 'LSwVel  ',0,Nr,0,1,1,myThid)
                0184         CALL DIAGNOSTICS_FILL(LS_theta,'LStheta ',0,Nr,0,1,1,myThid)
                0185         CALL DIAGNOSTICS_FILL(LS_salt, 'LSsalt  ',0,Nr,0,1,1,myThid)
                0186         IF ( ivdc_kappa .NE. 0. _d 0 .AND. .NOT. useKPP )
                0187      &   CALL DIAGNOSTICS_FILL(LS_IVDConvCount,
                0188      &                                 'LScnvAdj',0,Nr,0,1,1,myThid)
                0189 #ifdef SHORTWAVE_HEATING
                0190         CALL DIAGNOSTICS_FILL(LS_Qsw , 'LSqsw   ',0,1 ,0,1,1,myThid)
                0191 #endif
fda3710353 Oliv*0192         CALL DIAGNOSTICS_FILL(LS_fwFlux, 'LSfwFlux',0,1 ,0,1,1,myThid)
4e66ab0b67 Oliv*0193 #ifdef ALLOW_GMREDI
                0194         IF ( useGMRedi ) THEN
                0195          CALL DIAGNOSTICS_FILL(LS_Kwx , 'LSkwx   ',0,Nr,0,1,1,myThid)
                0196          CALL DIAGNOSTICS_FILL(LS_Kwy , 'LSkwy   ',0,Nr,0,1,1,myThid)
                0197          CALL DIAGNOSTICS_FILL(LS_Kwz , 'LSkwz   ',0,Nr,0,1,1,myThid)
                0198         ENDIF
                0199 #endif
                0200 #ifdef ALLOW_KPP
                0201         IF ( useKPP ) THEN
                0202          CALL DIAGNOSTICS_FILL(LS_KPPdiffKzs,
                0203      &                                 'LSKPPdfS',0,Nr,0,1,1,myThid)
                0204          CALL DIAGNOSTICS_FILL(LS_KPPghat,
                0205      &                                 'LSKPPght',0,Nr,0,1,1,myThid)
                0206         ENDIF
                0207 #endif
                0208 C       if useDiagnostics: end
                0209        ENDIF
                0210 #endif /* ALLOW_DIAGNOSTICS */
                0211 
7b3defa94d Jean*0212        _BARRIER
                0213        _BEGIN_MASTER(myThid)
                0214 C      we decide whether to do a timestep here and everybody else just
                0215 C      checks this variable.  This avoids complications with
                0216 C      staggerTimeStep
                0217        LS_doTimeStep = .TRUE.
                0218        _END_MASTER(myThid)
                0219        _BARRIER
                0220 
                0221       ELSEIF ( MOD(myIter, LS_nIter) .EQ. 0 ) THEN
                0222 
                0223 C      next time-step: switch back LS_doTimeStep
                0224        _BARRIER
                0225        _BEGIN_MASTER(myThid)
                0226        LS_doTimeStep = .FALSE.
                0227        _END_MASTER(myThid)
                0228        _BARRIER
                0229 
                0230 C      if MOD(myIter, LS_nIter): end
4e66ab0b67 Oliv*0231       ENDIF
                0232 
                0233 #endif /* ALLOW_LONGSTEP */
                0234 
                0235       RETURN
                0236       END
                0237