72 |
_RL rTrans(1-Olx:sNx+Olx,1-Oly:sNy+Oly) |
_RL rTrans(1-Olx:sNx+Olx,1-Oly:sNy+Oly) |
73 |
_RL rTransKp1(1-Olx:sNx+Olx,1-Oly:sNy+Oly) |
_RL rTransKp1(1-Olx:sNx+Olx,1-Oly:sNy+Oly) |
74 |
_RL localTijk(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr) |
_RL localTijk(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr) |
75 |
|
#ifdef ALLOW_DIAGNOSTICS |
76 |
|
INTEGER kk |
77 |
|
CHARACTER*8 diagName |
78 |
|
CHARACTER*4 GAD_DIAG_SUFX, diagSufx |
79 |
|
EXTERNAL GAD_DIAG_SUFX |
80 |
|
LOGICAL DIAGNOSTICS_IS_ON |
81 |
|
EXTERNAL DIAGNOSTICS_IS_ON |
82 |
|
_RL df (1-Olx:sNx+Olx,1-Oly:sNy+Oly) |
83 |
|
#endif |
84 |
CEOP |
CEOP |
85 |
|
|
86 |
IF (Nr.LE.1) RETURN |
C-- no need to solve anything with only 1 level: |
87 |
|
IF (Nr.GT.1) THEN |
88 |
|
|
89 |
C-- Initialise |
C-- Initialise |
90 |
iMin = 1 |
iMin = 1 |
133 |
DO k=2,Nr |
DO k=2,Nr |
134 |
DO j=jMin,jMax |
DO j=jMin,jMax |
135 |
DO i=iMin,iMax |
DO i=iMin,iMax |
136 |
IF (maskC(i,j,k-1,bi,bj).EQ.1.) |
b5d(i,j,k) = -dTtracerLev(k)*maskC(i,j,k-1,bi,bj) |
|
& b5d(i,j,k) = -deltaTtracer |
|
137 |
& *recip_hFacC(i,j,k,bi,bj)*recip_drF(k) |
& *recip_hFacC(i,j,k,bi,bj)*recip_drF(k) |
138 |
& *kappaRX(i,j, k )*recip_drC( k ) |
& *kappaRX(i,j, k )*recip_drC( k ) |
139 |
ENDDO |
ENDDO |
143 |
DO k=1,Nr-1 |
DO k=1,Nr-1 |
144 |
DO j=jMin,jMax |
DO j=jMin,jMax |
145 |
DO i=iMin,iMax |
DO i=iMin,iMax |
146 |
IF (maskC(i,j,k+1,bi,bj).EQ.1.) |
d5d(i,j,k) = -dTtracerLev(k)*maskC(i,j,k+1,bi,bj) |
|
& d5d(i,j,k) = -deltaTtracer |
|
147 |
& *recip_hFacC(i,j,k,bi,bj)*recip_drF(k) |
& *recip_hFacC(i,j,k,bi,bj)*recip_drF(k) |
148 |
& *KappaRX(i,j,k+1)*recip_drC(k+1) |
& *KappaRX(i,j,k+1)*recip_drC(k+1) |
149 |
ENDDO |
ENDDO |
204 |
DO i=iMin,iMax |
DO i=iMin,iMax |
205 |
c localTijk(i,j,k) = gTracer(i,j,k,bi,bj) |
c localTijk(i,j,k) = gTracer(i,j,k,bi,bj) |
206 |
gTracer(i,j,k,bi,bj) = gTracer(i,j,k,bi,bj) |
gTracer(i,j,k,bi,bj) = gTracer(i,j,k,bi,bj) |
207 |
& + deltaTtracer*recip_rA(i,j,bi,bj) |
& + dTtracerLev(1)*recip_rA(i,j,bi,bj) |
208 |
& *_recip_hFacC(i,j,k,bi,bj)*recip_drF(k) |
& *_recip_hFacC(i,j,k,bi,bj)*recip_drF(k) |
209 |
& *tracer(i,j,k,bi,bj)*(rTrans(i,j)-rTransKp1(i,j))*rkFac |
& *tracer(i,j,k,bi,bj)*(rTrans(i,j)-rTransKp1(i,j))*rkFac |
210 |
ENDDO |
ENDDO |
211 |
ENDDO |
ENDDO |
212 |
|
|
213 |
IF (K.GE.2) THEN |
#ifdef ALLOW_AIM |
214 |
|
C- a hack to prevent Water-Vapor vert.transport into the stratospheric level Nr |
215 |
|
IF ( K.GE.2 .AND. |
216 |
|
& (.NOT.useAIM .OR.tracerIdentity.NE.GAD_SALINITY .OR.K.LT.Nr) |
217 |
|
& ) THEN |
218 |
|
#else |
219 |
|
IF ( K.GE.2 ) THEN |
220 |
|
#endif |
221 |
|
|
222 |
IF ( advectionScheme.EQ.ENUM_CENTERED_2ND ) THEN |
IF ( advectionScheme.EQ.ENUM_CENTERED_2ND ) THEN |
223 |
diagonalNumber = 3 |
diagonalNumber = 3 |
224 |
CALL GAD_C2_IMPL_R( bi,bj,k, iMin,iMax,jMin,jMax, |
CALL GAD_C2_IMPL_R( bi,bj,k, iMin,iMax,jMin,jMax, |
225 |
I deltaTtracer, rTrans, |
I dTtracerLev, rTrans, |
226 |
U b5d, c5d, d5d, |
U b5d, c5d, d5d, |
227 |
I myThid) |
I myThid) |
228 |
ELSEIF (advectionScheme.EQ.ENUM_FLUX_LIMIT) THEN |
ELSEIF (advectionScheme.EQ.ENUM_FLUX_LIMIT) THEN |
229 |
diagonalNumber = 3 |
diagonalNumber = 3 |
230 |
CALL GAD_FLUXLIMIT_IMPL_R( bi,bj,k, iMin,iMax,jMin,jMax, |
CALL GAD_FLUXLIMIT_IMPL_R( bi,bj,k, iMin,iMax,jMin,jMax, |
231 |
I deltaTtracer, rTrans, localTijk, |
I dTtracerLev, rTrans, localTijk, |
232 |
U b5d, c5d, d5d, |
U b5d, c5d, d5d, |
233 |
I myThid) |
I myThid) |
234 |
ELSEIF (advectionScheme.EQ.ENUM_UPWIND_3RD .OR. |
ELSEIF (advectionScheme.EQ.ENUM_UPWIND_3RD .OR. |
235 |
& advectionScheme.EQ.ENUM_CENTERED_4TH) THEN |
& advectionScheme.EQ.ENUM_CENTERED_4TH) THEN |
236 |
diagonalNumber = 5 |
diagonalNumber = 5 |
237 |
CALL GAD_U3C4_IMPL_R( bi,bj,k, iMin,iMax,jMin,jMax, |
CALL GAD_U3C4_IMPL_R( bi,bj,k, iMin,iMax,jMin,jMax, |
238 |
I advectionScheme, deltaTtracer, rTrans, |
I advectionScheme, dTtracerLev, rTrans, |
239 |
U a5d, b5d, c5d, d5d, e5d, |
U a5d, b5d, c5d, d5d, e5d, |
240 |
I myThid) |
I myThid) |
241 |
ELSE |
ELSE |
274 |
STOP 'GAD_IMPLICIT_R: no solver available' |
STOP 'GAD_IMPLICIT_R: no solver available' |
275 |
ENDIF |
ENDIF |
276 |
|
|
277 |
|
#ifdef ALLOW_DIAGNOSTICS |
278 |
|
C-- Set diagnostic suffix for the current tracer |
279 |
|
IF ( useDiagnostics .AND. implicitDiffusion ) THEN |
280 |
|
diagSufx = GAD_DIAG_SUFX( tracerIdentity, myThid ) |
281 |
|
diagName = 'DFrI'//diagSufx |
282 |
|
IF ( DIAGNOSTICS_IS_ON(diagName,myThid) ) THEN |
283 |
|
DO k= 1,Nr |
284 |
|
IF ( k.EQ.1 ) THEN |
285 |
|
C- Note: Needs to call DIAGNOSTICS_FILL at level k=1 even if array == 0 |
286 |
|
C otherwise counter is not incremented !! |
287 |
|
DO j=1-OLy,sNy+OLy |
288 |
|
DO i=1-OLx,sNx+OLx |
289 |
|
df(i,j) = 0. _d 0 |
290 |
|
ENDDO |
291 |
|
ENDDO |
292 |
|
ELSE |
293 |
|
DO j=1,sNy |
294 |
|
DO i=1,sNx |
295 |
|
df(i,j) = |
296 |
|
& rA(i,j,bi,bj) |
297 |
|
& * KappaRX(i,j,k)*recip_drC(k) |
298 |
|
& * (gTracer(i,j,k,bi,bj) - gTracer(i,j,k-1,bi,bj)) |
299 |
|
ENDDO |
300 |
|
ENDDO |
301 |
|
ENDIF |
302 |
|
kk = -k |
303 |
|
CALL DIAGNOSTICS_FILL(df,diagName, kk,1, 2,bi,bj, myThid) |
304 |
|
ENDDO |
305 |
|
ENDIF |
306 |
|
ENDIF |
307 |
|
#endif /* ALLOW_DIAGNOSTICS */ |
308 |
|
|
309 |
|
C-- end if Nr > 1 |
310 |
|
ENDIF |
311 |
|
|
312 |
RETURN |
RETURN |
313 |
END |
END |