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