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_Y ( myThid ,
5ca83cd8f7 Dani*0006      I   VADV ,
                0007      I   TRAC ,
73e21ff944 Jean*0008      I   BC_FACEMASK,
5ca83cd8f7 Dani*0009      I   BC_YVALUES,
                0010      O   YFLUX,
                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 VADV         (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_YVALUES   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
                0032       _RL YFLUX        (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 vface, 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,sNy+1
                0064          Gj = (myYGlobalLo-1)+(bj-1)*sNy+j
                0065          DO i=1,sNx
                0066 C        THESE ARRAY BOUNDS INSURE THAT AFTER THIS STEP,
                0067 C        VALUES WILL BE RELIABLE 1 GRID CELLS OUT IN THE
                0068 C        X DIRECTION AND 1 CELLS OUT IN THE Y DIR
                0069           Gi = (myXGlobalLo-1)+(bi-1)*sNx+i
                0070           IF (((Gi .ge. 1) .and. (Gi .le. Nx)).or.
                0071      &       STREAMICE_EW_PERIODIC ) THEN
                0072            IF ((STREAMICE_hmask(i,j,bi,bj).eq.1.0) .or.
                0073      &         ((STREAMICE_hmask(i,j-1,bi,bj).eq.1.0) .and.
                0074      &          (STREAMICE_hmask(i,j,bi,bj).ne.1.0))) THEN
                0075 
                0076             vface = VADV(i,j,bi,bj)
                0077             cfl = ABS(vface) * time_step * recip_dyC(i,j,bi,bj)
                0078 
                0079 !            IF (BC_FACEMASK(i,j,bi,bj).eq.3.0) THEN
                0080 !              YFLUX (i,j,bi,bj) = BC_YVALUES(i,j,bi,bj) * vface
                0081 
                0082             IF (BC_FACEMASK(i,j,bi,bj).eq.3.0 .and.
                0083      &          vface.gt.0 .and.
                0084      &          STREAMICE_hmask(i,j,bi,bj).eq.1.0) THEN
                0085              YFLUX (i,j,bi,bj) = BC_YVALUES(i,j,bi,bj) * vface
                0086             ELSEIF
                0087      &          (BC_FACEMASK(i,j,bi,bj).eq.3.0 .and.
                0088      &          vface.le.0 .and.
                0089      &          STREAMICE_hmask(i,j-1,bi,bj).eq.1.0) THEN
                0090              YFLUX (i,j,bi,bj) = BC_YVALUES(i,j,bi,bj) * vface
                0091 
                0092             ELSE
                0093 
                0094              IF (vface .gt. 0. _d 0) THEN
                0095               DO k=-1,1
                0096                stencil (k) = TRAC(i,j+k-1,bi,bj)
                0097               ENDDO
                0098               IF ((STREAMICE_hmask(i,j,bi,bj).eq.1.0) .and.
73e21ff944 Jean*0099      &            (STREAMICE_hmask(i,j-2,bi,bj).eq.1.0))
                0100      &             H0_valid(i,j,bi,bj)=.true.
                0101 
5ca83cd8f7 Dani*0102               IF (((Gj.eq.1).and.(STREAMICE_hmask(i,j-1,bi,bj).eq.3.0))
                0103      &             .and.(.not.STREAMICE_NS_PERIODIC))
                0104      &         THEN  ! we are at western bdry and there is a thick. bdry cond
                0105 
                0106                YFLUX (i,j,bi,bj) = TRAC(i,j-1,bi,bj) * vface
                0107 
                0108               ELSEIF (H0_valid(i,j,bi,bj)) THEN
                0109 
                0110                rdenom = (stencil(1)-stencil(0))
                0111                IF (rdenom .ne. 0.) THEN
                0112                 Cr = (stencil(0)-stencil(-1))/rdenom
                0113                ELSE
                0114                 Cr = 1.E20 *  (stencil(0)-stencil(-1))
                0115                ENDIF
73e21ff944 Jean*0116 
5ca83cd8f7 Dani*0117                IF (STREAMICE_ADV_SCHEME.ne.'DST3') THEN
                0118 !                phi = SLOPE_LIMITER(stencil(0)-stencil(-1),
                0119 !     &                              stencil(1)-stencil(0))
                0120                  phi = SLOPE_LIMITER (Cr)
                0121                ELSE
                0122                 d0 = (2.-cfl)*(1.-cfl)/6.0
                0123                 d1 = (1.-cfl**2)/6.0
                0124                 psi = d0+d1*Cr
                0125                 phi = MAX(0. _d 0,MIN(MIN(1. _d 0,psi),
                0126      &                Cr*(1. _d 0 -CFL)/(CFL+1. _d -20) ))
73e21ff944 Jean*0127                ENDIF
5ca83cd8f7 Dani*0128 
                0129                IF (STREAMICE_ADV_SCHEME.ne.'DST3') THEN
                0130                 YFLUX (i,j,bi,bj) = vface *
73e21ff944 Jean*0131      &           (stencil(0) + phi * .5 * (1.0-cfl) *
5ca83cd8f7 Dani*0132      &           (stencil(1)-stencil(0)))
                0133                ELSE
                0134                 YFLUX (i,j,bi,bj) = vface *
                0135      &           (stencil(0) + phi *
                0136      &           (stencil(1)-stencil(0)))
                0137                ENDIF
                0138 
                0139               ELSE ! one of the two cells needed for a HO scheme is missing, use FO scheme
                0140 
                0141                YFLUX (i,j,bi,bj) = vface * stencil(0)
                0142 
                0143               ENDIF
73e21ff944 Jean*0144 
5ca83cd8f7 Dani*0145              ELSE IF (vface .lt. 0.0) THEN ! vface <= 0
                0146 
                0147               DO k=-1,1
                0148                stencil (k) = TRAC(i,j-k,bi,bj)
                0149               ENDDO
                0150               IF ((STREAMICE_hmask(i,j-1,bi,bj).eq.1.0) .and.
73e21ff944 Jean*0151      &            (STREAMICE_hmask(i,j+1,bi,bj).eq.1.0))
                0152      &             H0_valid(i,j,bi,bj)=.true.
5ca83cd8f7 Dani*0153 
                0154               IF (((Gj.eq.Ny).and.(STREAMICE_hmask(i,j+1,bi,bj).eq.3.0))
                0155      &             .and.(.not.STREAMICE_NS_PERIODIC))
                0156      &         THEN  ! we are at western bdry and there is a thick. bdry cond
                0157 
                0158                YFLUX (i,j,bi,bj) = TRAC(i,j+1,bi,bj) * vface
                0159 
                0160               ELSEIF (H0_valid(i,j,bi,bj)) THEN
                0161 
                0162                rdenom = (stencil(1)-stencil(0))
                0163                IF (rdenom .ne. 0.) THEN
                0164                 Cr = (stencil(0)-stencil(-1))/rdenom
                0165                ELSE
                0166                 Cr = 1.E20 *  (stencil(0)-stencil(-1))
                0167                ENDIF
                0168 
                0169                IF (STREAMICE_ADV_SCHEME.ne.'DST3') THEN
                0170 !                phi = SLOPE_LIMITER(stencil(0)-stencil(-1),
                0171 !     &                        stencil(1)-stencil(0))
                0172                  phi = SLOPE_LIMITER (Cr)
                0173                ELSE
                0174                 d0 = (2.-cfl)*(1.-cfl)/6.0
                0175                 d1 = (1.-cfl**2)/6.0
                0176                 psi = d0+d1*Cr
                0177                 phi = MAX(0. _d 0,MIN(MIN(1. _d 0,psi),
                0178      &                Cr*(1. _d 0 -CFL)/(CFL+1. _d -20) ))
                0179                ENDIF
                0180 
                0181                IF (STREAMICE_ADV_SCHEME.ne.'DST3') THEN
                0182                 YFLUX (i,j,bi,bj) = vface *
                0183      &           (stencil(0) + phi * .5 * (1.0-cfl) *
                0184      &           (stencil(1)-stencil(0)))
                0185                ELSE
                0186                 YFLUX (i,j,bi,bj) = vface *
                0187      &           (stencil(0) + phi *
                0188      &           (stencil(1)-stencil(0)))
                0189                ENDIF
                0190 
                0191               ELSE ! one of the two cells needed for a HO scheme is missing, use FO scheme
                0192 
                0193                yflux (i,j,bi,bj) = vface * stencil(0)
                0194 
                0195               ENDIF
                0196 
                0197              ELSE
                0198 
                0199               yflux (i,j,bi,bj) = 0. _d 0
                0200 
73e21ff944 Jean*0201              ENDIF
5ca83cd8f7 Dani*0202 
73e21ff944 Jean*0203             ENDIF
5ca83cd8f7 Dani*0204 
                0205            ENDIF
                0206           ENDIF
                0207          ENDDO
                0208         ENDDO
                0209        ENDDO
                0210       ENDDO
                0211 
                0212 !C     X-FLUXES AT CELL BOUNDARIES CALCULATED; NOW TAKE FLUX DIVERGENCE TO INCREMENT THICKNESS
73e21ff944 Jean*0213 !
5ca83cd8f7 Dani*0214 !      DO bj=myByLo(myThid),myByHi(myThid)
                0215 !       DO bi=myBxLo(myThid),myBxHi(myThid)
                0216 !        DO j=1-3,sNy+3
                0217 !         Gj = (myYGlobalLo-1)+(bj-1)*sNy+j
                0218 !         IF ((Gj .ge. 1) .and. (Gj .le. Ny)) THEN
                0219 !          DO i=1-2,sNx+2
                0220 !           IF (STREAMICE_hmask(i,j,bi,bj).eq.1.0) THEN
73e21ff944 Jean*0221 !            h(i,j,bi,bj) = h(i,j,bi,bj) - time_step *
5ca83cd8f7 Dani*0222 !     &       (hflux_x(i+1,j,bi,bj)*dyG(i+1,j,bi,bj) -
                0223 !     &        hflux_x(i,j,bi,bj)*dyG(i,j,bi,bj)) *
                0224 !     &       recip_rA (i,j,bi,bj)
                0225 !           ENDIF
                0226 !          ENDDO
                0227 !         ENDIF
                0228 !        ENDDO
                0229 !       ENDDO
                0230 !      ENDDO
                0231 
                0232 #endif
                0233       RETURN
                0234       END SUBROUTINE STREAMICE_ADV_FLUX_FL_Y