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_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
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 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
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
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-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
0069
0070
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
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
0116
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
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
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
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
0168
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
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
73e21ff944 Jean*0211
5ca83cd8f7 Dani*0212
0213
0214
0215
0216
0217
0218
73e21ff944 Jean*0219
5ca83cd8f7 Dani*0220
0221
0222
0223
0224
0225
0226
0227
0228
0229
0230 #endif
0231 RETURN
0232 END SUBROUTINE STREAMICE_ADV_FLUX_FL_X