Back to home page

MITgcm

 
 

    


File indexing completed on 2021-06-23 05:11:41 UTC

view on githubraw file Latest commit eaee6fe0 on 2021-06-18 20:43:21 UTC
87ea84cac6 Jean*0001 #include "THSICE_OPTIONS.h"
                0002 
                0003 CBOP
                0004 C     !ROUTINE: THSICE_SLAB_OCEAN
                0005 C     !INTERFACE:
3a77421753 Jean*0006       SUBROUTINE THSICE_SLAB_OCEAN(
                0007      I                      aim_sWght0, aim_sWght1,
2d218141ac Jean*0008      O                      dTsurf,
3a77421753 Jean*0009      I                      bi, bj, myTime, myIter, myThid )
87ea84cac6 Jean*0010 C     !DESCRIPTION: \bv
                0011 C     *==========================================================*
                0012 C     | S/R  THSICE_SLAB_OCEAN
3a77421753 Jean*0013 C     | o Slab ocean for atmosphere (and sea-ice) model
87ea84cac6 Jean*0014 C     *==========================================================*
                0015 C     | o add ocean-surface fluxes + restoring term
                0016 C     |   and step forward ocean mixed-layer Temp. & Salinity
                0017 C     *==========================================================*
                0018 C     \ev
                0019 
                0020 C     !USES:
                0021       IMPLICIT NONE
                0022 
                0023 C     == Global variables ==
                0024 C-- MITgcm
                0025 #include "SIZE.h"
                0026 #include "EEPARAMS.h"
                0027 #include "PARAMS.h"
                0028 #include "FFIELDS.h"
                0029 
                0030 C-- Sea-Ice package
                0031 #include "THSICE_PARAMS.h"
                0032 #include "THSICE_VARS.h"
41e6ab0e43 Jean*0033 #include "THSICE_TAVE.h"
87ea84cac6 Jean*0034 
                0035 C-- Physics package
                0036 #ifdef ALLOW_AIM
                0037 #include "AIM_FFIELDS.h"
                0038 #endif
                0039 
                0040 C     !INPUT/OUTPUT PARAMETERS:
                0041 C     == Routine Arguments ==
3a77421753 Jean*0042 C     aim_sWght0 :: weight for time interpolation of surface BC
                0043 C     aim_sWght1 :: 0/1 = time period before/after the current time
                0044 C     dTsurf     :: diagnostics of slab-ocean temperature change [K/iter]
                0045 C     bi,bj      :: tile indices
                0046 C     myTime     :: Current time of simulation ( s )
                0047 C     myIter     :: Current iteration number in simulation
                0048 C     myThid     :: my Thread number Id.
                0049       _RL     aim_sWght0, aim_sWght1
                0050       _RL     dTsurf(sNx,sNy)
                0051       _RL     myTime
87ea84cac6 Jean*0052       INTEGER bi,bj
3a77421753 Jean*0053       INTEGER myIter, myThid
87ea84cac6 Jean*0054 CEOP
                0055 
                0056 #ifdef ALLOW_THSICE
                0057 
                0058 C     == Local variables ==
                0059 C     i,j          :: Loop counters
2cf110c259 Jean*0060       _RL dtFac, fwFac, heatFac
                0061 #ifdef ALLOW_AIM
5e328a6c4a Davi*0062       _RL oceTfreez, locTemp, locQflux, dtFacR
2cf110c259 Jean*0063 #endif
87ea84cac6 Jean*0064       INTEGER i,j
                0065 
c8458785ea Patr*0066 cph the following structure is not supported by TAF
                0067 cph      IF ( .NOT.stepFwd_oceMxL ) RETURN
                0068       IF ( stepFwd_oceMxL ) THEN
87ea84cac6 Jean*0069 
                0070 C--    add heat flux and fresh-water + salt flux :
                0071        dtFac   = ocean_deltaT/rhosw
6206cdb986 Jean*0072        fwFac   = ocean_deltaT*sMxL_default/rhosw
87ea84cac6 Jean*0073        heatFac = ocean_deltaT/(cpwater*rhosw)
                0074        DO j=1,sNy
                0075         DO i=1,sNx
                0076          IF ( hOceMxL(i,j,bi,bj).NE.0. _d 0 ) THEN
2d218141ac Jean*0077           dTsurf(i,j) = tOceMxL(i,j,bi,bj)
87ea84cac6 Jean*0078           tOceMxL(i,j,bi,bj) = tOceMxL(i,j,bi,bj)
                0079      &       - heatFac*Qnet(i,j,bi,bj) / hOceMxL(i,j,bi,bj)
                0080           sOceMxL(i,j,bi,bj) = sOceMxL(i,j,bi,bj)
                0081      &       + (fwFac*EmPmR(i,j,bi,bj) - dtFac*saltFlux(i,j,bi,bj))
                0082      &                                 / hOceMxL(i,j,bi,bj)
                0083          ENDIF
                0084         ENDDO
                0085        ENDDO
                0086 
                0087 #ifdef ALLOW_AIM
cb1db3a022 Davi*0088        IF ( tauRelax_MxL_salt .GT. 0. _d 0 ) THEN
                0089 C--    add restoring (backward) toward climatological fixed Salinity
                0090         dtFac   = ocean_deltaT/tauRelax_MxL_salt
                0091         dtFacR  = 1. _d 0 /(1. _d 0 + dtFac)
                0092         DO j=1,sNy
                0093          DO i=1,sNx
                0094           IF ( hOceMxL(i,j,bi,bj).NE.0. _d 0 ) THEN
                0095            sOceMxL(i,j,bi,bj) =
                0096      &         (sOceMxL(i,j,bi,bj) + dtFac*sMxL_default)*dtFacR
                0097           ENDIF
                0098          ENDDO
                0099         ENDDO
                0100        ENDIF
3a77421753 Jean*0101        IF ( tauRelax_MxL .GT. 0. _d 0 ) THEN
7c5790770d Davi*0102 C--    add restoring (backward) toward climatological Temp.
3a77421753 Jean*0103         dtFac   = ocean_deltaT/tauRelax_MxL
                0104         dtFacR  = 1. _d 0 /(1. _d 0 + dtFac)
                0105         oceTfreez = - 1.9 _d 0
                0106         DO j=1,sNy
                0107          DO i=1,sNx
                0108           IF ( hOceMxL(i,j,bi,bj).NE.0. _d 0 ) THEN
                0109            oceTfreez = -mu_Tf*sOceMxL(i,j,bi,bj)
                0110            locTemp = ( aim_sWght0*aim_sst0(i,j,bi,bj)
                0111      &               + aim_sWght1*aim_sst1(i,j,bi,bj)
                0112      &               ) - celsius2K
                0113            locTemp = MAX( locTemp , oceTfreez )
                0114            tOceMxL(i,j,bi,bj) =
87ea84cac6 Jean*0115      &         (tOceMxL(i,j,bi,bj) + dtFac*locTemp)*dtFacR
3a77421753 Jean*0116           ENDIF
                0117          ENDDO
87ea84cac6 Jean*0118         ENDDO
3a77421753 Jean*0119        ENDIF
5e328a6c4a Davi*0120        DO j=1,sNy
                0121         DO i=1,sNx
                0122           IF ( hOceMxL(i,j,bi,bj).NE.0. _d 0 ) THEN
                0123            locQflux = ( aim_sWght0*aim_qfx0(i,j,bi,bj)
                0124      &                + aim_sWght1*aim_qfx1(i,j,bi,bj)
                0125      &                )
                0126            tOceMxL(i,j,bi,bj) = tOceMxL(i,j,bi,bj)
                0127      &            + heatFac*locQflux / hOceMxL(i,j,bi,bj)
                0128           ENDIF
                0129         ENDDO
                0130        ENDDO
87ea84cac6 Jean*0131 #endif /* ALLOW_AIM */
                0132 
2d218141ac Jean*0133 C-    Diagnose surf. temp. change
                0134        DO j=1,sNy
                0135         DO i=1,sNx
                0136          IF ( hOceMxL(i,j,bi,bj).NE.0. _d 0 ) THEN
                0137           dTsurf(i,j) = tOceMxL(i,j,bi,bj) - dTsurf(i,j)
                0138          ENDIF
                0139         ENDDO
                0140        ENDDO
                0141 
41e6ab0e43 Jean*0142 #ifdef ALLOW_TIMEAVE
                0143 C-- average of Ocean Mixed-Layer temp. & salinity
                0144        IF ( thSIce_taveFreq .GT. 0. _d 0 ) THEN
                0145         CALL TIMEAVE_CUMULATE( ice_tMxL_Ave, tOceMxL,
                0146      &                         1, thSIce_deltaT, bi, bj, myThid )
                0147         CALL TIMEAVE_CUMULATE( ice_sMxL_Ave, sOceMxL,
                0148      &                         1, thSIce_deltaT, bi, bj, myThid )
                0149        ENDIF
                0150 #endif /* ALLOW_TIMEAVE */
                0151 
c8458785ea Patr*0152 c-- End of IF ( stepFwd_oceMxL ) THEN
                0153       ENDIF
                0154 
41e6ab0e43 Jean*0155 C--   Cumulate time-averaged fields and also fill-up flux diagnostics
                0156 C     (if not done in THSICE_DO_ADVECT call)
                0157       IF ( thSIceAdvScheme.LE.0 ) THEN
                0158          CALL THSICE_AVE(
                0159      I                    bi, bj, myTime, myIter, myThid )
                0160       ENDIF
                0161 
87ea84cac6 Jean*0162 #endif  /* ALLOW_THSICE */
                0163 
                0164       RETURN
                0165       END