Back to home page

MITgcm

 
 

    


File indexing completed on 2022-01-06 06:13:25 UTC

view on githubraw file Latest commit 9f5240b5 on 2022-01-05 15:24:45 UTC
0c3d35c9cd Gael*0001 #include "SMOOTH_OPTIONS.h"
                0002 
                0003 C !INTERFACE: ==========================================================
9f5240b52a Jean*0004       SUBROUTINE SMOOTH_RHS( fld_in, gt_in, myThid )
0c3d35c9cd Gael*0005 
                0006 C     *==========================================================*
                0007 C     | SUBROUTINE smooth_rhs
9f5240b52a Jean*0008 C     | o As part of smooth_diff3D, this routine computes the
0c3d35c9cd Gael*0009 C     |   right hand side of the tendency equation (see below).
                0010 C     |   It is made of bits from model/src and pkg/generic_advdiff
                0011 C     |   pieced togheter.
                0012 C     *==========================================================*
                0013 
                0014 C !DESCRIPTION:
                0015 C Calculates the tendency of a tracer due to advection and diffusion.
                0016 C It calculates the fluxes in each direction indepentently and then
                0017 C sets the tendency to the divergence of these fluxes. The advective
                0018 C fluxes are only calculated here when using the linear advection schemes
                0019 C otherwise only the diffusive and parameterized fluxes are calculated.
                0020 C
                0021 C Contributions to the flux are calculated and added:
                0022 C \begin{equation*}
                0023 C {\bf F} = {\bf F}_{adv} + {\bf F}_{diff} +{\bf F}_{GM} + {\bf F}_{KPP}
                0024 C \end{equation*}
                0025 C
                0026 C The tendency is the divergence of the fluxes:
                0027 C \begin{equation*}
                0028 C G_\theta = G_\theta + \nabla \cdot {\bf F}
                0029 C \end{equation*}
                0030 C
                0031 C The tendency is assumed to contain data on entry.
                0032 
                0033 C !USES: ===============================================================
                0034       IMPLICIT NONE
                0035 #include "SIZE.h"
                0036 #include "EEPARAMS.h"
                0037 #include "PARAMS.h"
                0038 #include "GRID.h"
                0039 #include "SMOOTH.h"
                0040 
                0041 C !INPUT PARAMETERS: ===================================================
9f5240b52a Jean*0042       _RL fld_in(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
                0043       _RL gt_in (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
5fda927278 Gael*0044       INTEGER myThid
0c3d35c9cd Gael*0045 
5fda927278 Gael*0046 C local variables:
0c3d35c9cd Gael*0047       INTEGER bi,bj,iMin,iMax,jMin,jMax
                0048       _RS xA    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
                0049       _RS yA    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
                0050       _RS maskUp(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
                0051       _RL dTdz  (nSx,nSy)
                0052       _RL dTdx  (nSx,nSy)
                0053       _RL dTdy  (nSx,nSy)
                0054       INTEGER i,j,k
9f5240b52a Jean*0055       _RL fZon  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
                0056       _RL fMer  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
                0057       _RL fVerT (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
0c3d35c9cd Gael*0058       _RL df    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
5fda927278 Gael*0059 
0c3d35c9cd Gael*0060       DO bj=myByLo(myThid),myByHi(myThid)
                0061        DO bi=myBxLo(myThid),myBxHi(myThid)
                0062 
                0063 c 1rst k loop: initialization
                0064         DO k=1,Nr
5fda927278 Gael*0065          DO j=1-OLy,sNy+OLy
                0066           DO i=1-OLx,sNx+OLx
9f5240b52a Jean*0067            fZon(i,j,k,bi,bj)  = 0. _d 0
                0068            fMer(i,j,k,bi,bj)  = 0. _d 0
5fda927278 Gael*0069            fVerT(i,j,k,bi,bj) = 0. _d 0
                0070            gt_in(i,j,k,bi,bj) = 0. _d 0
                0071           ENDDO
                0072          ENDDO
0c3d35c9cd Gael*0073         ENDDO
                0074 
5fda927278 Gael*0075         iMin = 1-OLx+1
                0076         iMax = sNx+OLx-1
                0077         jMin = 1-OLy+1
                0078         jMax = sNy+OLy-1
0c3d35c9cd Gael*0079 
                0080 c 2nd k loop: flux computation
                0081         DO k=1,Nr
                0082 
5fda927278 Gael*0083          DO j=1-OLy,sNy+OLy
                0084           DO i=1-OLx,sNx+OLx
9f5240b52a Jean*0085            df(i,j,bi,bj) = 0. _d 0
5fda927278 Gael*0086            xA(i,j,bi,bj) = _dyG(i,j,bi,bj)
                0087      &      *drF(k)*smooth_hFacW(i,j,k,bi,bj)
                0088            yA(i,j,bi,bj) = _dxG(i,j,bi,bj)
                0089      &      *drF(k)*smooth_hFacS(i,j,k,bi,bj)
9f5240b52a Jean*0090            IF (k .EQ. 1) THEN
5fda927278 Gael*0091              maskUp(i,j,bi,bj) = 0.
                0092            ELSE
9f5240b52a Jean*0093             maskUp(i,j,bi,bj) =
5fda927278 Gael*0094      &        maskC(i,j,k-1,bi,bj)*maskC(i,j,k,bi,bj)
                0095            ENDIF
                0096           ENDDO
                0097          ENDDO
0c3d35c9cd Gael*0098 
                0099 c      ///gmredi_xtr///
                0100 
5fda927278 Gael*0101          DO j=jMin,jMax
                0102           DO i=iMin,iMax
9f5240b52a Jean*0103            df(i,j,bi,bj) = df(i,j,bi,bj)
5fda927278 Gael*0104      &       -xA(i,j,bi,bj)
                0105      &       *smooth3D_Kux(i,j,k,bi,bj)
                0106      &       *recip_dxC(i,j,bi,bj)
                0107      &       *(fld_in(i,j,k,bi,bj)-fld_in(i-1,j,k,bi,bj))
                0108           ENDDO
                0109          ENDDO
0c3d35c9cd Gael*0110 
9f5240b52a Jean*0111          DO j=jMin,jMax
                0112           DO i=iMin,iMax
5fda927278 Gael*0113            dTdz(bi,bj) =  0.5*(
                0114      &      +0.5*recip_drC(k)*
                0115      &       ( maskC(i-1,j,k,bi,bj)*
                0116      &       (fld_in(i-1,j, MAX(k-1,1) ,bi,bj)-fld_in(i-1,j,k,bi,bj))
                0117      &       +maskC( i ,j,k,bi,bj)*
                0118      &       (fld_in( i ,j, MAX(k-1,1) ,bi,bj)-fld_in( i ,j,k,bi,bj))
                0119      &       )
                0120      &      +0.5*recip_drC(MIN(k+1,Nr))*
                0121      &       ( maskC(i-1,j,MIN(k+1,Nr),bi,bj)*
                0122      &       (fld_in(i-1,j,k,bi,bj)-fld_in(i-1,j,MIN(k+1,Nr),bi,bj))
                0123      &       +maskC( i ,j,MIN(k+1,Nr),bi,bj)*
                0124      &       (fld_in( i ,j,k,bi,bj)-fld_in( i ,j,MIN(k+1,Nr),bi,bj))
9f5240b52a Jean*0125      &       )                )
                0126            df(i,j,bi,bj) = df(i,j,bi,bj)
5fda927278 Gael*0127      &      - xA(i,j,bi,bj)*smooth3D_Kuz(i,j,k,bi,bj)*dTdz(bi,bj)
                0128           ENDDO
9f5240b52a Jean*0129          ENDDO
0c3d35c9cd Gael*0130 
5fda927278 Gael*0131          DO j=jMin,jMax
                0132           DO i=iMin,iMax
                0133            dTdy(bi,bj) = 0.5*(
                0134      &      +0.5*(maskS(i,j,k,bi,bj)
0c3d35c9cd Gael*0135      &         *recip_dyC(i,j,bi,bj)*
                0136      &         (fld_in(i,j,k,bi,bj)-fld_in(i,j-1,k,bi,bj))
                0137      &        +maskS(i,j+1,k,bi,bj)
                0138      &        *recip_dyC(i,j+1,bi,bj)*
                0139      &        (fld_in(i,j+1,k,bi,bj)-fld_in(i,j,k,bi,bj)))
5fda927278 Gael*0140      &      +0.5*(maskS(i-1,j,k,bi,bj)
0c3d35c9cd Gael*0141      &        *recip_dyC(i,j,bi,bj)*
                0142      &        (fld_in(i-1,j,k,bi,bj)-fld_in(i-1,j-1,k,bi,bj))
                0143      &        +maskS(i-1,j+1,k,bi,bj)
                0144      &        *recip_dyC(i,j+1,bi,bj)*
                0145      &        (fld_in(i-1,j+1,k,bi,bj)-fld_in(i-1,j,k,bi,bj)))
5fda927278 Gael*0146      &       )
                0147            df(i,j,bi,bj) = df(i,j,bi,bj)
                0148      &      - xA(i,j,bi,bj)*smooth3D_Kuy(i,j,k,bi,bj)*dTdy(bi,bj)
9f5240b52a Jean*0149           ENDDO
                0150          ENDDO
0c3d35c9cd Gael*0151 
                0152 c      /// end for x ///
                0153 
9f5240b52a Jean*0154          DO j=jMin,jMax
                0155           DO i=iMin,iMax
                0156            fZon(i,j,k,bi,bj) = fZon(i,j,k,bi,bj) + df(i,j,bi,bj)
5fda927278 Gael*0157           ENDDO
                0158          ENDDO
0c3d35c9cd Gael*0159 
9f5240b52a Jean*0160          DO j=jMin,jMax
                0161           DO i=iMin,iMax
                0162            df(i,j,bi,bj) = 0.
5fda927278 Gael*0163           ENDDO
9f5240b52a Jean*0164          ENDDO
0c3d35c9cd Gael*0165 
                0166 c      ///gmredi_ytr///
                0167 
5fda927278 Gael*0168          DO j=jMin,jMax
                0169           DO i=iMin,iMax
                0170            df(i,j,bi,bj) = df(i,j,bi,bj)
                0171      &      -yA(i,j,bi,bj)
                0172      &       *smooth3D_Kvy(i,j,k,bi,bj)
                0173      &       *recip_dyC(i,j,bi,bj)
                0174      &       *(fld_in(i,j,k,bi,bj)-fld_in(i,j-1,k,bi,bj))
                0175           ENDDO
                0176          ENDDO
0c3d35c9cd Gael*0177 
9f5240b52a Jean*0178          DO j=jMin,jMax
                0179           DO i=iMin,iMax
5fda927278 Gael*0180            dTdz(bi,bj) =  0.5*(
                0181      &      +0.5*recip_drC(k)*
                0182      &       ( maskC(i,j-1,k,bi,bj)*
                0183      &          (fld_in(i,j-1,MAX(k-1,1),bi,bj)-fld_in(i,j-1,k,bi,bj))
                0184      &         +maskC(i, j ,k,bi,bj)*
                0185      &          (fld_in(i, j ,MAX(k-1,1),bi,bj)-fld_in(i, j ,k,bi,bj))
                0186      &       )
                0187      &      +0.5*recip_drC(MIN(k+1,Nr))*
                0188      &       ( maskC(i,j-1,MIN(k+1,Nr),bi,bj)*
                0189      &         (fld_in(i,j-1,k,bi,bj)-fld_in(i,j-1,MIN(k+1,Nr),bi,bj))
                0190      &         +maskC(i, j ,MIN(k+1,Nr),bi,bj)*
                0191      &         (fld_in(i, j ,k,bi,bj)-fld_in(i, j ,MIN(k+1,Nr),bi,bj))
                0192      &       )      )
9f5240b52a Jean*0193            df(i,j,bi,bj) = df(i,j,bi,bj)
                0194      &      - yA(i,j,bi,bj)*smooth3D_Kvz(i,j,k,bi,bj)*dTdz(bi,bj)
5fda927278 Gael*0195           ENDDO
9f5240b52a Jean*0196          ENDDO
0c3d35c9cd Gael*0197 
5fda927278 Gael*0198          DO j=jMin,jMax
                0199           DO i=iMin,iMax
                0200            dTdx(bi,bj) = 0.5*(
                0201      &      +0.5*(maskW(i+1,j,k,bi,bj)
                0202      &            *recip_dxC(i+1,j,bi,bj)*
                0203      &            (fld_in(i+1,j,k,bi,bj)-fld_in(i,j,k,bi,bj))
                0204      &            +maskW(i,j,k,bi,bj)
                0205      &            *recip_dxC(i,j,bi,bj)*
                0206      &            (fld_in(i,j,k,bi,bj)-fld_in(i-1,j,k,bi,bj)))
                0207      &      +0.5*(maskW(i+1,j-1,k,bi,bj)
                0208      &            *recip_dxC(i+1,j,bi,bj)*
                0209      &            (fld_in(i+1,j-1,k,bi,bj)-fld_in(i,j-1,k,bi,bj))
                0210      &            +maskW(i,j-1,k,bi,bj)
                0211      &            *recip_dxC(i,j,bi,bj)*
                0212      &            (fld_in(i,j-1,k,bi,bj)-fld_in(i-1,j-1,k,bi,bj)))
                0213      &       )
9f5240b52a Jean*0214            df(i,j,bi,bj) = df(i,j,bi,bj)
                0215      &      - yA(i,j,bi,bj)*smooth3D_Kvx(i,j,k,bi,bj)*dTdx(bi,bj)
5fda927278 Gael*0216           ENDDO
                0217          ENDDO
0c3d35c9cd Gael*0218 
9f5240b52a Jean*0219 c      /// end for y ///
                0220 
                0221          DO j=jMin,jMax
                0222           DO i=iMin,iMax
                0223            fMer(i,j,k,bi,bj) = fMer(i,j,k,bi,bj) + df(i,j,bi,bj)
5fda927278 Gael*0224           ENDDO
9f5240b52a Jean*0225          ENDDO
0c3d35c9cd Gael*0226 
9f5240b52a Jean*0227          DO j=jMin,jMax
                0228           DO i=iMin,iMax
                0229            df(i,j,bi,bj) = 0.
5fda927278 Gael*0230           ENDDO
9f5240b52a Jean*0231          ENDDO
0c3d35c9cd Gael*0232 
                0233 c       /// GAD_DIFF_R ///
                0234 
9f5240b52a Jean*0235          IF ( k.GT.1 .AND. .NOT.smooth3DdoImpldiff ) THEN
5fda927278 Gael*0236           DO j=jMin,jMax
                0237            DO i=iMin,iMax
                0238             df(i,j,bi,bj) =
                0239      &        -_rA(i,j,bi,bj)
                0240      &        *smooth3D_kappaR(i,j,k,bi,bj)*recip_drC(k)
                0241      &        *(fld_in(i,j,k,bi,bj)
                0242      &        -fld_in(i,j,k-1,bi,bj))*rkSign
9f5240b52a Jean*0243            ENDDO
                0244           ENDDO
                0245          ENDIF
0c3d35c9cd Gael*0246 
                0247 c      ///gmredi rtrans///
                0248 
9f5240b52a Jean*0249          IF (k.GT.1) THEN
                0250           DO j=jMin,jMax
                0251            DO i=iMin,iMax
                0252             dTdx(bi,bj) = 0.5*(
                0253      &       +0.5*(maskW(i+1,j,k,bi,bj)
                0254      &             *recip_dxC(i+1,j,bi,bj)*
                0255      &             (fld_in(i+1,j,k,bi,bj)-fld_in(i,j,k,bi,bj))
5fda927278 Gael*0256      &            +maskW(i,j,k,bi,bj)
9f5240b52a Jean*0257      &             *recip_dxC(i,j,bi,bj)*
                0258      &             (fld_in(i,j,k,bi,bj)-fld_in(i-1,j,k,bi,bj)))
                0259      &       +0.5*(maskW(i+1,j,k-1,bi,bj)
                0260      &             *recip_dxC(i+1,j,bi,bj)*
                0261      &             (fld_in(i+1,j,k-1,bi,bj)-fld_in(i,j,k-1,bi,bj))
5fda927278 Gael*0262      &            +maskW(i,j,k-1,bi,bj)
9f5240b52a Jean*0263      &             *recip_dxC(i,j,bi,bj)*
                0264      &             (fld_in(i,j,k-1,bi,bj)-fld_in(i-1,j,k-1,bi,bj)))
                0265      &                        )
                0266 
                0267             dTdy(bi,bj) = 0.5*(
                0268      &       +0.5*(maskS(i,j,k,bi,bj)
                0269      &             *recip_dyC(i,j,bi,bj)*
                0270      &             (fld_in(i,j,k,bi,bj)-fld_in(i,j-1,k,bi,bj))
                0271      &            +maskS(i,j+1,k,bi,bj)
                0272      &             *recip_dyC(i,j+1,bi,bj)*
                0273      &             (fld_in(i,j+1,k,bi,bj)-fld_in(i,j,k,bi,bj)))
                0274      &       +0.5*(maskS(i,j,k-1,bi,bj)
                0275      &             *recip_dyC(i,j,bi,bj)*
                0276      &             (fld_in(i,j,k-1,bi,bj)-fld_in(i,j-1,k-1,bi,bj))
                0277      &            +maskS(i,j+1,k-1,bi,bj)
                0278      &             *recip_dyC(i,j+1,bi,bj)*
                0279      &             (fld_in(i,j+1,k-1,bi,bj)-fld_in(i,j,k-1,bi,bj)))
                0280      &                        )
                0281 
                0282             df(i,j,bi,bj) = df(i,j,bi,bj)
5fda927278 Gael*0283      &           - rA(i,j,bi,bj)
                0284      &           *( smooth3D_Kwx(i,j,k,bi,bj)*dTdx(bi,bj)
9f5240b52a Jean*0285      &             +smooth3D_Kwy(i,j,k,bi,bj)*dTdy(bi,bj) )
0c3d35c9cd Gael*0286 
9f5240b52a Jean*0287            ENDDO
5fda927278 Gael*0288           ENDDO
                0289          ENDIF
0c3d35c9cd Gael*0290 
                0291 c     /// end for r ///
                0292 
9f5240b52a Jean*0293          IF (k.GT.1) THEN
                0294           DO j=jMin,jMax
                0295            DO i=iMin,iMax
                0296             fVerT(i,j,k-1,bi,bj) = fVerT(i,j,k-1,bi,bj)
                0297      &       + df(i,j,bi,bj)*maskUp(i,j,bi,bj)
                0298            ENDDO
5fda927278 Gael*0299           ENDDO
                0300          ENDIF
0c3d35c9cd Gael*0301 
5fda927278 Gael*0302          DO j=jMin,jMax
                0303           DO i=iMin,iMax
                0304            df(i,j,bi,bj) = 0.
                0305           ENDDO
                0306          ENDDO
0c3d35c9cd Gael*0307 
5fda927278 Gael*0308         ENDDO !k
                0309        ENDDO !bi
                0310       ENDDO !bj
0c3d35c9cd Gael*0311 
                0312 c these exchanges are crucial:
                0313       CALL EXCH_UV_XYZ_RL(fZon,fMer,.TRUE.,myThid)
be12682802 Gael*0314       CALL EXCH_XYZ_RL ( fVerT, myThid )
0c3d35c9cd Gael*0315 
                0316       DO bj=myByLo(myThid),myByHi(myThid)
                0317        DO bi=myBxLo(myThid),myBxHi(myThid)
                0318 c 3rd k loop: Divergence of fluxes
                0319         DO k=1,Nr
9f5240b52a Jean*0320          IF (k.GT.1) THEN
                0321           DO j=jMin,jMax
                0322            DO i=iMin,iMax
                0323             gt_in(i,j,k,bi,bj) = gt_in(i,j,k,bi,bj)
                0324      &       -smooth_recip_hFacC(i,j,k,bi,bj)*recip_drF(k)
                0325      &       *recip_rA(i,j,bi,bj)
                0326      &       *( (fZon(i+1,j,k,bi,bj)-fZon(i,j,k,bi,bj))
                0327      &         +(fMer(i,j+1,k,bi,bj)-fMer(i,j,k,bi,bj))
                0328      &         +(fVerT(i,j,k,bi,bj)-fVerT(i,j,k-1,bi,bj))*rkSign
                0329      &        )
                0330            ENDDO
0c3d35c9cd Gael*0331           ENDDO
9f5240b52a Jean*0332          ELSE
                0333           DO j=jMin,jMax
                0334            DO i=iMin,iMax
                0335             gt_in(i,j,k,bi,bj) = gt_in(i,j,k,bi,bj)
                0336      &       -smooth_recip_hFacC(i,j,k,bi,bj)*recip_drF(k)
                0337      &       *recip_rA(i,j,bi,bj)
                0338      &       *( (fZon(i+1,j,k,bi,bj)-fZon(i,j,k,bi,bj))
                0339      &         +(fMer(i,j+1,k,bi,bj)-fMer(i,j,k,bi,bj))
                0340      &         +(fVerT(i,j,k,bi,bj))*rkSign
                0341      &        )
                0342            ENDDO
0c3d35c9cd Gael*0343           ENDDO
9f5240b52a Jean*0344          ENDIF
0c3d35c9cd Gael*0345         ENDDO
5fda927278 Gael*0346 
0c3d35c9cd Gael*0347        ENDDO
                0348       ENDDO
                0349 
9f5240b52a Jean*0350       CALL EXCH_XYZ_RL( gt_in, myThid )
0c3d35c9cd Gael*0351 
9f5240b52a Jean*0352       RETURN
0c3d35c9cd Gael*0353       END
                0354