Back to home page

MITgcm

 
 

    


File indexing completed on 2021-04-08 05:12:21 UTC

view on githubraw file Latest commit ba0b0470 on 2021-04-08 01:06:32 UTC
e10b4e6008 Patr*0001 #include "SALT_PLUME_OPTIONS.h"
                0002 
                0003 CBOP
                0004 C     !ROUTINE: SALT_PLUME_APPLY
                0005 C     !INTERFACE:
                0006       SUBROUTINE SALT_PLUME_APPLY(
                0007      I            trIdentity, bi, bj,
                0008      I            recip_hFac_arg,
                0009      I            tracer,trApplyFlag,
                0010      I            myTime, myIter, myThid )
                0011 
                0012 C     U            trStar,
                0013 
                0014 C     !DESCRIPTION: \bv
                0015 C     *==========================================================*
                0016 C     | SUBROUTINE SALT_PLUME_APPLY
                0017 C     | o Apply the salt_pume-transport to tracer field
                0018 C     *==========================================================*
                0019 C     \ev
                0020 
                0021 C     !USES:
                0022       IMPLICIT NONE
                0023 
                0024 C     === Global variables ===
                0025 #include "SIZE.h"
                0026 #include "GRID.h"
                0027 #include "EEPARAMS.h"
                0028 #include "PARAMS.h"
                0029 #include "DYNVARS.h"
                0030 #include "SALT_PLUME.h"
                0031 #ifdef ALLOW_GENERIC_ADVDIFF
                0032 # include "GAD.h"
                0033 #endif
                0034 
                0035 C     !INPUT/OUTPUT PARAMETERS:
                0036 C     === Routine arguments ===
                0037 C     trIdentity :: tracer identification number
                0038 C     bi,bj      :: Tile indices
                0039 C     recip_drF  :: Reciprol of cell thickness
                0040 C     recip_hFac_arg :: Reciprol of cell open-depth factor
                0041 C     tracer     :: tracer field at current time (input)
                0042 C     trApplyFlag:: [0]=update saltplume forcing T/S terms
                0043 C                :: [1]=update gTr tendency
                0044 C     trStar     :: future tracer field (modified)
                0045 C     myTime     :: Current time in simulation
                0046 C     myIter     :: Current time-step number
                0047 C     myThid     :: my Thread Id. number
                0048 
                0049       INTEGER trIdentity, trApplyFlag
                0050       INTEGER bi, bj
                0051       _RS recip_hFac_arg(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr)
                0052       _RL tracer        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
                0053 C      _RL trStar        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
                0054 
                0055       _RL     myTime
                0056       INTEGER myIter, myThid
                0057 
                0058 #ifdef ALLOW_SALT_PLUME
                0059 #ifdef SALT_PLUME_VOLUME
                0060 
                0061 C     !LOCAL VARIABLES:
                0062 C     === Local variables ===
                0063 C     msgBuf     :: Informational/error message buffer
ba0b047096 Mart*0064 C     plumetend  :: forcing terms [W/m2 or g/m2/s]
e10b4e6008 Patr*0065 C     work       :: working array
                0066       CHARACTER*(MAX_LEN_MBUF) msgBuf
                0067       INTEGER i, j, k
                0068       INTEGER upward
                0069       LOGICAL onOffFlag
                0070       _RL gTr_Surf2kLev, gTr_Below2kLev, gTr_kLev2Above,
                0071      &    dSPvolBelow2kLev, gTr_totSurf2Below,
                0072      &    SurfVal, SEAICE_Tfrz, ConvertFac, recip_ConvertFac
                0073       integer kp1, Nrp1
                0074       _RL         plumetend(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr)
                0075       _RL         work(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr+1)
                0076 
                0077 #ifdef ALLOW_DIAGNOSTICS
                0078       CHARACTER*8 diagName
                0079       CHARACTER*4 diagSufx
                0080       LOGICAL     doDiagSPtend
                0081 C-    Functions:
                0082       LOGICAL  DIAGNOSTICS_IS_ON
                0083       EXTERNAL DIAGNOSTICS_IS_ON
                0084 #ifdef ALLOW_GENERIC_ADVDIFF
                0085       CHARACTER*5 GAD_DIAG_SUFX
                0086       EXTERNAL    GAD_DIAG_SUFX
                0087 #endif /* ALLOW_GENERIC_ADVDIFF */
                0088 #endif /* ALLOW_DIAGNOSTICS */
                0089 
                0090 CEOP
                0091 
                0092 C      WRITE(msgBuf,'(A,2i4)') 'trApplyFlag,trIdentity: ',
                0093 C     & trApplyFlag,trIdentity
                0094 C         CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
                0095 C     &                      SQUEEZE_RIGHT, myThid )
                0096 
                0097       IF ( trApplyFlag.LT.0 .OR. trApplyFlag.GT.1) THEN
                0098        STOP 'S/R SALT_PLUME_APPLY: incorrect setting of trApplyFlag!'
                0099       ELSE
                0100 
                0101        SEAICE_Tfrz = -1.96 _d 0
                0102 
                0103        onOffFlag = .FALSE.
                0104 #ifdef ALLOW_GENERIC_ADVDIFF
                0105        IF ( trIdentity.EQ.GAD_TEMPERATURE ) onOffFlag = .TRUE.
                0106        IF ( trIdentity.EQ.GAD_SALINITY    ) onOffFlag = .TRUE.
                0107 #endif
                0108        IF ( onOffFlag ) THEN
                0109 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
                0110 
                0111 c       upward = rkSign*NINT(-gravitySign)
                0112         upward = 1
                0113         IF (usingZCoords) upward = -1
f21016b86e Jean*0114 
e10b4e6008 Patr*0115         IF ( trIdentity.EQ.GAD_TEMPERATURE ) THEN
                0116          SurfVal          = SEAICE_Tfrz
                0117          ConvertFac       = HeatCapacity_Cp*rhoConst
                0118          recip_ConvertFac = mass2rUnit/HeatCapacity_Cp
                0119 #ifdef ALLOW_DIAGNOSTICS
                0120          IF ( useDiagnostics ) diagSufx = '_TH '
                0121 #endif /* ALLOW_DIAGNOSTICS */
                0122         ENDIF
                0123         IF ( trIdentity.EQ.GAD_SALINITY ) THEN
                0124          SurfVal          = SPbrineSconst
                0125          ConvertFac       = rhoConst
                0126          recip_ConvertFac = mass2rUnit
                0127 #ifdef ALLOW_DIAGNOSTICS
                0128          IF ( useDiagnostics ) diagSufx = '_SLT'
                0129 #endif /* ALLOW_DIAGNOSTICS */
                0130         ENDIF
f21016b86e Jean*0131 
e10b4e6008 Patr*0132 #ifdef ALLOW_DIAGNOSTICS
                0133         doDiagSPtend = .FALSE.
                0134         diagName = 'SPtd'
                0135         IF ( useDiagnostics ) THEN
                0136 C--   Set diagnostic suffix for the current tracer
                0137 #ifdef ALLOW_GENERIC_ADVDIFF
                0138          diagSufx = GAD_DIAG_SUFX( trIdentity, myThid )
                0139 #endif /* ALLOW_GENERIC_ADVDIFF */
                0140          diagName = 'SPtd'//diagSufx
                0141          doDiagSPtend = DIAGNOSTICS_IS_ON(diagName,myThid)
                0142         ENDIF
                0143 #endif /* ALLOW_DIAGNOSTICS */
                0144 
                0145 C-- initializing:
                0146         Nrp1=Nr+1
                0147         DO k=1,Nr
352c2064d4 antn*0148          DO j=1-OLy,sNy+OLy
                0149           DO i=1-OLx,sNx+OLx
e10b4e6008 Patr*0150            plumetend(i,j,k) = 0. _d 0
                0151            work(i,j,k) = tracer(i,j,k,bi,bj)
                0152           ENDDO
                0153          ENDDO
                0154         ENDDO
352c2064d4 antn*0155         DO j=1-OLy,sNy+OLy
                0156          DO i=1-OLx,sNx+OLx
e10b4e6008 Patr*0157            work(i,j,Nrp1) = 0. _d 0
                0158          ENDDO
                0159         ENDDO
                0160 C-----------------
                0161 
f21016b86e Jean*0162 Catn: After discussion with JM, it is cleaner to remove the negative
e10b4e6008 Patr*0163 c     buoyancy associated with saltplumeflux from the surface lev
                0164 c     here instead of inside salt_plume_forcing_surf.F and
                0165 c     kpp_forcing_surf.F:
f21016b86e Jean*0166 
e10b4e6008 Patr*0167         IF(trApplyFlag.LT.1) THEN
                0168 C ======= if trApplyFlag==0: calc SPforcing[T,S] =================
                0169          IF(trIdentity.EQ.GAD_TEMPERATURE) THEN
                0170           DO k=1,Nr
                0171            DO j=1-OLy,sNy+OLy
                0172             DO i=1-OLx,sNx+OLx
                0173              SPforcingT(i,j,k,bi,bj)=0. _d 0
                0174             ENDDO
                0175            ENDDO
                0176           ENDDO
                0177          ENDIF
                0178          IF(trIdentity.EQ.GAD_SALINITY) THEN
                0179           DO k=1,Nr
                0180            DO j=1-OLy,sNy+OLy
                0181             DO i=1-OLx,sNx+OLx
                0182              SPforcingS(i,j,k,bi,bj)=0. _d 0
                0183             ENDDO
                0184            ENDDO
                0185           ENDDO
                0186          ENDIF
                0187 
                0188          DO k=Nr,1,-1
                0189           kp1=k+1
                0190           DO j=1-OLy,sNy+OLy
                0191            DO i=1-OLx,sNx+OLx
                0192 C           IF(trIdentity.EQ.GAD_SALINITY) SurfVal=SPbrineSalt(i,j,bi,bj)
                0193            IF(trIdentity.EQ.GAD_TEMPERATURE) SurfVal=tracer(i,j,1,bi,bj)
ba0b047096 Mart*0194 Catn: m/s*[degC,g/kg]
e10b4e6008 Patr*0195             gTr_totSurf2Below = SPbrineVolFlux(i,j,bi,bj)*SurfVal
                0196             gTr_Surf2kLev = dSPvolSurf2kLev(i,j,k,bi,bj) * SurfVal
                0197             dSPvolBelow2kLev = -dSPvolkLev2Above(i,j,kp1,bi,bj)
                0198             gTr_Below2kLev= dSPvolBelow2kLev * work(i,j,kp1)
                0199 Catn: gTr_kLev2Above works even for kLev=1 because this is how much
f21016b86e Jean*0200 C volume of original [salinity,heat] associated with [SSS,SST]
e10b4e6008 Patr*0201 C was replaced by same volume of brine [salt,heat(from SEAICE_Tfrz)].
                0202 C Note: by design, dSPvolkLev2Above already is negative
                0203             gTr_kLev2Above= dSPvolkLev2Above(i,j,k,bi,bj) * work(i,j,k)
                0204 
ba0b047096 Mart*0205 C salt: [m/s * g/m3] = [g/s/m2] = unit of saltPlumeFlux
e10b4e6008 Patr*0206 C theta:[m/s * kg/m3 * J/kg/degC * degC] = [W/m2]
                0207             plumetend(i,j,k) = ConvertFac *
                0208      &          ( gTr_Surf2kLev + gTr_Below2kLev + gTr_kLev2Above )
f21016b86e Jean*0209             IF(k.eq.1) plumetend(i,j,k) = ConvertFac *
e10b4e6008 Patr*0210      &          ( gTr_Surf2kLev + gTr_Below2kLev)
f21016b86e Jean*0211 C remove negative buoyancy from surface,
e10b4e6008 Patr*0212 C used to be in salt_plume_forcing_surf.F
                0213 C           IF(k.EQ.1) THEN
f21016b86e Jean*0214 C            plumetend(i,j,k) = plumetend(i,j,k)
e10b4e6008 Patr*0215 C     &                         - ConvertFac*gTr_totSurf2Below
                0216 C           ENDIF
                0217 
                0218 Catn: report T/S SPforcing[T,S] related to saltplumeflux for kpp
                0219 C     and return zero to do_oceanic_phys.F; unit: [g/m2/s or W/m2]
                0220 C            trStar(i,j,k,bi,bj) = 0. _d 0
                0221             IF (trIdentity.EQ.GAD_SALINITY) THEN
                0222              SPforcingS(i,j,k,bi,bj)=plumetend(i,j,k)
                0223             ENDIF
                0224             IF (trIdentity.EQ.GAD_TEMPERATURE) THEN
                0225              SPforcingT(i,j,k,bi,bj)=plumetend(i,j,k)
                0226             ENDIF
                0227            ENDDO
                0228           ENDDO
                0229          ENDDO
                0230 #ifdef ALLOW_DIAGNOSTICS
                0231         IF ( doDiagSPtend )
                0232      &   CALL DIAGNOSTICS_FILL(plumetend, diagName, 0,Nr,2,bi,bj,myThid)
                0233 #endif /* ALLOW_DIAGNOSTICS */
                0234 
                0235         ELSE
                0236 C ============ updating gTr =====================================
ba0b047096 Mart*0237 Catn: updating tendency gTr (gS,gT); unit: [g/kg/s or degC/s]
e10b4e6008 Patr*0238 C         WRITE(msgBuf,'(a,2e24.17)') 'b4SPap: [Tr,gTr](1,1,1,bi,bj):',
                0239 C     &     tracer(1,1,1,bi,bj),trStar(1,1,1,bi,bj)
                0240 C         CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
                0241 C     &                      SQUEEZE_RIGHT, myThid )
                0242          DO k=Nr,1,-1
                0243           kp1=k+1
                0244           DO j=1-OLy,sNy+OLy
                0245            DO i=1-OLx,sNx+OLx
f21016b86e Jean*0246             IF (trIdentity.EQ.GAD_TEMPERATURE)
e10b4e6008 Patr*0247      &       plumetend(i,j,k)=SPforcingT(i,j,k,bi,bj)
                0248             IF (trIdentity.EQ.GAD_SALINITY) THEN
                0249              plumetend(i,j,k)=SPforcingS(i,j,k,bi,bj)
                0250             ENDIF
f21016b86e Jean*0251 
e10b4e6008 Patr*0252 C            trStar(i,j,k,bi,bj)=trStar(i,j,k,bi,bj)+plumetend(i,j,k)
                0253 C     &      *recip_drF(k)*recip_hFac_arg(i,j,k)
                0254 C     &      *recip_ConvertFac
                0255            ENDDO
                0256           ENDDO
                0257          ENDDO
                0258 
                0259         ENDIF
                0260 
                0261 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
                0262 C--    end if on-off-flag
                0263        ENDIF
                0264 C--   end trApplyFlag
                0265       ENDIF
                0266 
                0267 #endif /* SALT_PLUME_VOLUME */
                0268 #endif /* ALLOW_SALT_PLUME */
                0269 
                0270       RETURN
                0271       END