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
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
0016
0017
0018
0019
0020 #include "SIZE.h"
0021 #include "GRID.h"
0022 #include "EEPARAMS.h"
0023 #include "PARAMS.h"
0024 #include "STREAMICE.h"
0025
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
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
5ca83cd8f7 Dani*0044
0045 _RL SLOPE_LIMITER
0046
0047 external SLOPE_LIMITER
0048
0049
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
0067
0068
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
0080
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
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
0119
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
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
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
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
0171
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
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
73e21ff944 Jean*0213
5ca83cd8f7 Dani*0214
0215
0216
0217
0218
0219
0220
73e21ff944 Jean*0221
5ca83cd8f7 Dani*0222
0223
0224
0225
0226
0227
0228
0229
0230
0231
0232 #endif
0233 RETURN
0234 END SUBROUTINE STREAMICE_ADV_FLUX_FL_Y