Back to home page

MITgcm

 
 

    


File indexing completed on 2018-03-02 18:44:08 UTC

view on githubraw file Latest commit add29e06 on 2018-01-31 20:35:05 UTC
5ca83cd8f7 Dani*0001 #include "STREAMICE_OPTIONS.h"
                0002 
                0003 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
                0004 
73e21ff944 Jean*0005       SUBROUTINE STREAMICE_ADV_FLUX_FL_X ( myThid ,
5ca83cd8f7 Dani*0006      I   UADV ,
                0007      I   TRAC ,
73e21ff944 Jean*0008      I   BC_FACEMASK,
5ca83cd8f7 Dani*0009      I   BC_XVALUES,
                0010      O   XFLUX,
                0011      I   time_step )
                0012 
                0013       IMPLICIT NONE
                0014 
                0015 C     O   hflux_x ! flux per unit width across face
                0016 C     O   h
                0017 C     I   time_step
                0018 
                0019 C     === Global variables ===
                0020 #include "SIZE.h"
                0021 #include "GRID.h"
                0022 #include "EEPARAMS.h"
                0023 #include "PARAMS.h"
                0024 #include "STREAMICE.h"
                0025 !#include "GAD_FLUX_LIMITER.h"
                0026 
                0027       INTEGER myThid
73e21ff944 Jean*0028       _RL UADV         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
                0029       _RL TRAC         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
                0030       _RS BC_FACEMASK  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
                0031       _RL BC_XVALUES   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
                0032       _RL XFLUX        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
5ca83cd8f7 Dani*0033       _RL time_step
73e21ff944 Jean*0034 
5ca83cd8f7 Dani*0035 #ifdef ALLOW_STREAMICE
                0036 
                0037 C     LOCAL VARIABLES
                0038 
                0039       INTEGER i, j, bi, bj, Gi, Gj, k
                0040       _RL uface, phi, cfl, Cr, rdenom, d0, d1, psi
                0041       _RL stencil (-1:1)
73e21ff944 Jean*0042       LOGICAL H0_valid(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
                0043                         ! there are valid cells to calculate a
5ca83cd8f7 Dani*0044                         ! slope-limited 2nd order flux
                0045       _RL SLOPE_LIMITER
                0046 !       _RL total_vol_out
                0047       external SLOPE_LIMITER
                0048 
                0049 !       total_vol_out = 0.0
                0050 
                0051       DO bj=myByLo(myThid),myByHi(myThid)
                0052        DO bi=myBxLo(myThid),myBxHi(myThid)
                0053         DO j=1-oly,sNy+oly
                0054          DO i=1-olx,sNx+olx
                0055           H0_valid(i,j,bi,bj)=.false.
                0056          ENDDO
                0057         ENDDO
                0058        ENDDO
                0059       ENDDO
                0060 
                0061       DO bj=myByLo(myThid),myByHi(myThid)
                0062        DO bi=myBxLo(myThid),myBxHi(myThid)
                0063         DO j=1-3,sNy+3
                0064          Gj = (myYGlobalLo-1)+(bj-1)*sNy+j
73e21ff944 Jean*0065          IF (((Gj .ge. 1) .and. (Gj .le. Ny))
5ca83cd8f7 Dani*0066      &       .or.STREAMICE_NS_PERIODIC) THEN
                0067           DO i=1,sNx+1
                0068 C        THESE ARRAY BOUNDS INSURE THAT AFTER THIS STEP,
                0069 C        VALUES WILL BE RELIABLE 1 GRID CELLS OUT IN THE
                0070 C        X DIRECTION AND 3 CELLS OUT IN THE Y DIR
                0071            IF ((STREAMICE_hmask(i,j,bi,bj).eq.1.0) .or.
                0072      &         ((STREAMICE_hmask(i-1,j,bi,bj).eq.1.0) .and.
                0073      &          (STREAMICE_hmask(i,j,bi,bj).ne.1.0))) THEN
                0074 
                0075             Gi = (myXGlobalLo-1)+(bi-1)*sNx+i
73e21ff944 Jean*0076 
5ca83cd8f7 Dani*0077             uface = UADV(i,j,bi,bj)
                0078             cfl = ABS(uface) * time_step * recip_dxC(i,j,bi,bj)
                0079 
                0080             IF (BC_FACEMASK(i,j,bi,bj).eq.3.0 .and.
73e21ff944 Jean*0081      &          uface.gt.0 .and.
5ca83cd8f7 Dani*0082      &          STREAMICE_hmask(i,j,bi,bj).eq.1.0) THEN
                0083              XFLUX (i,j,bi,bj) = BC_XVALUES(i,j,bi,bj) * uface
                0084             ELSEIF
                0085      &          (BC_FACEMASK(i,j,bi,bj).eq.3.0 .and.
73e21ff944 Jean*0086      &          uface.le.0 .and.
5ca83cd8f7 Dani*0087      &          STREAMICE_hmask(i-1,j,bi,bj).eq.1.0) THEN
                0088              XFLUX (i,j,bi,bj) = BC_XVALUES(i,j,bi,bj) * uface
                0089             ELSE
                0090 
                0091              IF (uface .gt. 0. _d 0) THEN
                0092               DO k=-1,1
                0093                stencil (k) = TRAC(i+k-1,j,bi,bj)
                0094               ENDDO
                0095               IF ((STREAMICE_hmask(i,j,bi,bj).eq.1.0) .and.
73e21ff944 Jean*0096      &            (STREAMICE_hmask(i-2,j,bi,bj).eq.1.0))
                0097      &             H0_valid(i,j,bi,bj)=.true.
                0098 
5ca83cd8f7 Dani*0099               IF (((Gi.eq.1).and.(STREAMICE_hmask(i-1,j,bi,bj).eq.3.0))
73e21ff944 Jean*0100      &             .and.(.not.STREAMICE_EW_PERIODIC))
5ca83cd8f7 Dani*0101      &         THEN  ! we are at western bdry and there is a thick. bdry cond
                0102 
                0103                XFLUX (i,j,bi,bj) = TRAC(i-1,j,bi,bj) * uface
                0104 
                0105               ELSEIF (H0_valid(i,j,bi,bj)) THEN
                0106 
                0107                rdenom = (stencil(1)-stencil(0))
                0108                IF (rdenom .ne. 0.) THEN
                0109                 Cr = (stencil(0)-stencil(-1))/rdenom
                0110                ELSE
                0111                 Cr = 1.E20 *  (stencil(0)-stencil(-1))
                0112                ENDIF
                0113 
                0114                IF (STREAMICE_ADV_SCHEME.ne.'DST3') THEN
                0115 !                phi = SLOPE_LIMITER(stencil(0)-stencil(-1),
                0116 !     &                              stencil(1)-stencil(0))
                0117                  phi = SLOPE_LIMITER (Cr)
                0118                ELSE
                0119                 d0 = (2.-cfl)*(1.-cfl)/6.0
                0120                 d1 = (1.-cfl**2)/6.0
                0121                 psi = d0+d1*Cr
                0122                 phi = MAX(0. _d 0,MIN(MIN(1. _d 0,psi),
                0123      &                Cr*(1. _d 0 -CFL)/(CFL+1. _d -20) ))
73e21ff944 Jean*0124                ENDIF
5ca83cd8f7 Dani*0125 
                0126                IF (STREAMICE_ADV_SCHEME.ne.'DST3') THEN
                0127                 XFLUX (i,j,bi,bj) = uface *
73e21ff944 Jean*0128      &           (stencil(0) + phi * .5 * (1.0-cfl) *
5ca83cd8f7 Dani*0129      &           (stencil(1)-stencil(0)))
                0130                ELSE
                0131                 XFLUX (i,j,bi,bj) = uface *
                0132      &           (stencil(0) + phi *
                0133      &           (stencil(1)-stencil(0)))
                0134                ENDIF
                0135 
                0136               ELSE ! one of the two cells needed for a HO scheme is missing, use FO scheme
                0137 
                0138                XFLUX (i,j,bi,bj) = uface * stencil(0)
                0139 
                0140               ENDIF
73e21ff944 Jean*0141 
5ca83cd8f7 Dani*0142              ELSEIF (uface .lt. 0. _d 0) THEN ! uface <= 0
                0143 
                0144               DO k=-1,1
                0145                stencil (k) = TRAC(i-k,j,bi,bj)
                0146               ENDDO
                0147               IF ((STREAMICE_hmask(i-1,j,bi,bj).eq.1.0) .and.
73e21ff944 Jean*0148      &            (STREAMICE_hmask(i+1,j,bi,bj).eq.1.0))
                0149      &             H0_valid(i,j,bi,bj)=.true.
5ca83cd8f7 Dani*0150 
                0151               IF (((Gi.eq.Nx).and.(STREAMICE_hmask(i+1,j,bi,bj).eq.3.0))
73e21ff944 Jean*0152      &            .and.(.not.STREAMICE_EW_PERIODIC))
5ca83cd8f7 Dani*0153      &         THEN  ! we are at western bdry and there is a thick. bdry cond
                0154 
                0155                XFLUX (i,j,bi,bj) = TRAC(i+1,j,bi,bj) * uface
                0156 
                0157               ELSEIF (H0_valid(i,j,bi,bj)) THEN
                0158 
                0159                rdenom = (stencil(1)-stencil(0))
                0160                IF (rdenom .ne. 0.) THEN
                0161                 Cr = (stencil(0)-stencil(-1))/rdenom
                0162                ELSE
                0163                 Cr = 1.E20 *  (stencil(0)-stencil(-1))
                0164                ENDIF
                0165 
                0166                IF (STREAMICE_ADV_SCHEME.ne.'DST3') THEN
                0167 !                phi = SLOPE_LIMITER(stencil(0)-stencil(-1),
                0168 !     &                        stencil(1)-stencil(0))
                0169                  phi = SLOPE_LIMITER (Cr)
                0170 
                0171                ELSE
                0172                 d0 = (2.-cfl)*(1.-cfl)/6.0
                0173                 d1 = (1.-cfl**2)/6.0
                0174                 psi = d0+d1*Cr
                0175                 phi = MAX(0. _d 0,MIN(MIN(1. _d 0,psi),
                0176      &                Cr*(1. _d 0 -CFL)/(CFL+1. _d -20) ))
                0177                ENDIF
                0178 
                0179                IF (STREAMICE_ADV_SCHEME.ne.'DST3') THEN
                0180                 XFLUX (i,j,bi,bj) = uface *
                0181      &           (stencil(0) + phi * .5 * (1.0-cfl) *
                0182      &           (stencil(1)-stencil(0)))
                0183                ELSE
                0184                 XFLUX (i,j,bi,bj) = uface *
                0185      &           (stencil(0) + phi *
                0186      &           (stencil(1)-stencil(0)))
                0187                ENDIF
                0188 
                0189               ELSE ! one of the two cells needed for a HO scheme is missing, use FO scheme
                0190 
                0191                Xflux (i,j,bi,bj) = uface * stencil(0)
                0192 
                0193               ENDIF
                0194 
                0195              ELSE
                0196 
                0197               Xflux (i,j,bi,bj) = 0. _d 0
                0198 
                0199              ENDIF
                0200 
73e21ff944 Jean*0201             ENDIF
5ca83cd8f7 Dani*0202 
                0203            ENDIF
                0204           ENDDO
                0205          ENDIF
                0206         ENDDO
                0207        ENDDO
                0208       ENDDO
                0209 
                0210 !C     X-FLUXES AT CELL BOUNDARIES CALCULATED; NOW TAKE FLUX DIVERGENCE TO INCREMENT THICKNESS
73e21ff944 Jean*0211 !
5ca83cd8f7 Dani*0212 !      DO bj=myByLo(myThid),myByHi(myThid)
                0213 !       DO bi=myBxLo(myThid),myBxHi(myThid)
                0214 !        DO j=1-3,sNy+3
                0215 !         Gj = (myYGlobalLo-1)+(bj-1)*sNy+j
                0216 !         IF ((Gj .ge. 1) .and. (Gj .le. Ny)) THEN
                0217 !          DO i=1-2,sNx+2
                0218 !           IF (STREAMICE_hmask(i,j,bi,bj).eq.1.0) THEN
73e21ff944 Jean*0219 !            h(i,j,bi,bj) = h(i,j,bi,bj) - time_step *
5ca83cd8f7 Dani*0220 !     &       (hflux_x(i+1,j,bi,bj)*dyG(i+1,j,bi,bj) -
                0221 !     &        hflux_x(i,j,bi,bj)*dyG(i,j,bi,bj)) *
                0222 !     &       recip_rA (i,j,bi,bj)
                0223 !           ENDIF
                0224 !          ENDDO
                0225 !         ENDIF
                0226 !        ENDDO
                0227 !       ENDDO
                0228 !      ENDDO
                0229 
                0230 #endif
                0231       RETURN
                0232       END SUBROUTINE STREAMICE_ADV_FLUX_FL_X