Back to home page

MITgcm

 
 

    


File indexing completed on 2025-06-05 05:08:27 UTC

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