157 |
C-- Make local copy of tracer array |
C-- Make local copy of tracer array |
158 |
DO j=1-OLy,sNy+OLy |
DO j=1-OLy,sNy+OLy |
159 |
DO i=1-OLx,sNx+OLx |
DO i=1-OLx,sNx+OLx |
160 |
localT(i,j)=tracer(i,j,k,bi,bj) |
localT(i,j)=Tracer(i,j,k,bi,bj) |
161 |
ENDDO |
ENDDO |
162 |
ENDDO |
ENDDO |
163 |
|
|
190 |
IF (calcAdvection) THEN |
IF (calcAdvection) THEN |
191 |
IF (advectionScheme.EQ.ENUM_CENTERED_2ND) THEN |
IF (advectionScheme.EQ.ENUM_CENTERED_2ND) THEN |
192 |
CALL GAD_C2_ADV_X(bi,bj,k,uTrans,localT,af,myThid) |
CALL GAD_C2_ADV_X(bi,bj,k,uTrans,localT,af,myThid) |
193 |
|
ELSEIF ( advectionScheme.EQ.ENUM_UPWIND_1RST |
194 |
|
& .OR. advectionScheme.EQ.ENUM_DST2 ) THEN |
195 |
|
CALL GAD_DST2U1_ADV_X( bi,bj,k, advectionScheme, |
196 |
|
I dTtracerLev(k), uTrans, uVel, localT, |
197 |
|
O af, myThid ) |
198 |
ELSEIF (advectionScheme.EQ.ENUM_FLUX_LIMIT) THEN |
ELSEIF (advectionScheme.EQ.ENUM_FLUX_LIMIT) THEN |
199 |
CALL GAD_FLUXLIMIT_ADV_X( bi,bj,k, dTtracerLev(k), |
CALL GAD_FLUXLIMIT_ADV_X( bi,bj,k, dTtracerLev(k), |
200 |
I uTrans, uVel, maskW(1-Olx,1-Oly,k,bi,bj), localT, |
I uTrans, uVel, maskW(1-Olx,1-Oly,k,bi,bj), localT, |
290 |
IF (calcAdvection) THEN |
IF (calcAdvection) THEN |
291 |
IF (advectionScheme.EQ.ENUM_CENTERED_2ND) THEN |
IF (advectionScheme.EQ.ENUM_CENTERED_2ND) THEN |
292 |
CALL GAD_C2_ADV_Y(bi,bj,k,vTrans,localT,af,myThid) |
CALL GAD_C2_ADV_Y(bi,bj,k,vTrans,localT,af,myThid) |
293 |
|
ELSEIF ( advectionScheme.EQ.ENUM_UPWIND_1RST |
294 |
|
& .OR. advectionScheme.EQ.ENUM_DST2 ) THEN |
295 |
|
CALL GAD_DST2U1_ADV_Y( bi,bj,k, advectionScheme, |
296 |
|
I dTtracerLev(k), vTrans, vVel, localT, |
297 |
|
O af, myThid ) |
298 |
ELSEIF (advectionScheme.EQ.ENUM_FLUX_LIMIT) THEN |
ELSEIF (advectionScheme.EQ.ENUM_FLUX_LIMIT) THEN |
299 |
CALL GAD_FLUXLIMIT_ADV_Y( bi,bj,k, dTtracerLev(k), |
CALL GAD_FLUXLIMIT_ADV_Y( bi,bj,k, dTtracerLev(k), |
300 |
I vTrans, vVel, maskS(1-Olx,1-Oly,k,bi,bj), localT, |
I vTrans, vVel, maskS(1-Olx,1-Oly,k,bi,bj), localT, |
391 |
#endif |
#endif |
392 |
C- Compute vertical advective flux in the interior: |
C- Compute vertical advective flux in the interior: |
393 |
IF (vertAdvecScheme.EQ.ENUM_CENTERED_2ND) THEN |
IF (vertAdvecScheme.EQ.ENUM_CENTERED_2ND) THEN |
394 |
CALL GAD_C2_ADV_R(bi,bj,k,rTrans,tracer,af,myThid) |
CALL GAD_C2_ADV_R(bi,bj,k,rTrans,Tracer,af,myThid) |
395 |
|
ELSEIF ( vertAdvecScheme.EQ.ENUM_UPWIND_1RST |
396 |
|
& .OR. vertAdvecScheme.EQ.ENUM_DST2 ) THEN |
397 |
|
CALL GAD_DST2U1_ADV_R( bi,bj,k, vertAdvecScheme, |
398 |
|
I dTtracerLev(k),rTrans,wVel,Tracer(1-Olx,1-Oly,1,bi,bj), |
399 |
|
O af, myThid ) |
400 |
ELSEIF (vertAdvecScheme.EQ.ENUM_FLUX_LIMIT) THEN |
ELSEIF (vertAdvecScheme.EQ.ENUM_FLUX_LIMIT) THEN |
401 |
CALL GAD_FLUXLIMIT_ADV_R( |
CALL GAD_FLUXLIMIT_ADV_R( bi,bj,k, |
402 |
& bi,bj,k,dTtracerLev(k),rTrans,wVel,tracer,af,myThid) |
I dTtracerLev(k),rTrans,wVel,Tracer(1-Olx,1-Oly,1,bi,bj), |
403 |
|
O af, myThid ) |
404 |
ELSEIF (vertAdvecScheme.EQ.ENUM_UPWIND_3RD ) THEN |
ELSEIF (vertAdvecScheme.EQ.ENUM_UPWIND_3RD ) THEN |
405 |
CALL GAD_U3_ADV_R(bi,bj,k,rTrans,tracer,af,myThid) |
CALL GAD_U3_ADV_R(bi,bj,k,rTrans,Tracer,af,myThid) |
406 |
ELSEIF (vertAdvecScheme.EQ.ENUM_CENTERED_4TH) THEN |
ELSEIF (vertAdvecScheme.EQ.ENUM_CENTERED_4TH) THEN |
407 |
CALL GAD_C4_ADV_R(bi,bj,k,rTrans,tracer,af,myThid) |
CALL GAD_C4_ADV_R(bi,bj,k,rTrans,Tracer,af,myThid) |
408 |
ELSEIF (vertAdvecScheme.EQ.ENUM_DST3 ) THEN |
ELSEIF (vertAdvecScheme.EQ.ENUM_DST3 ) THEN |
409 |
CALL GAD_DST3_ADV_R( |
CALL GAD_DST3_ADV_R( bi,bj,k, |
410 |
& bi,bj,k,dTtracerLev(k),rTrans,wVel,tracer,af,myThid) |
I dTtracerLev(k),rTrans,wVel,Tracer(1-Olx,1-Oly,1,bi,bj), |
411 |
|
O af, myThid ) |
412 |
ELSEIF (vertAdvecScheme.EQ.ENUM_DST3_FLUX_LIMIT ) THEN |
ELSEIF (vertAdvecScheme.EQ.ENUM_DST3_FLUX_LIMIT ) THEN |
413 |
cph This block is to trick the adjoint: |
cph This block is to trick the adjoint: |
414 |
cph IF inAdExact=.FALSE., we want to use DST3 |
cph IF inAdExact=.FALSE., we want to use DST3 |
415 |
cph with limiters in forward, but without limiters in reverse. |
cph with limiters in forward, but without limiters in reverse. |
416 |
IF ( inAdMode ) THEN |
IF ( inAdMode ) THEN |
417 |
CALL GAD_DST3_ADV_R( |
CALL GAD_DST3_ADV_R( bi,bj,k, |
418 |
& bi,bj,k,dTtracerLev(k),rTrans,wVel,tracer,af,myThid) |
I dTtracerLev(k),rTrans,wVel,Tracer(1-Olx,1-Oly,1,bi,bj), |
419 |
|
O af, myThid ) |
420 |
ELSE |
ELSE |
421 |
CALL GAD_DST3FL_ADV_R( |
CALL GAD_DST3FL_ADV_R( bi,bj,k, |
422 |
& bi,bj,k,dTtracerLev(k),rTrans,wVel,tracer,af,myThid) |
I dTtracerLev(k),rTrans,wVel,Tracer(1-Olx,1-Oly,1,bi,bj), |
423 |
|
O af, myThid ) |
424 |
ENDIF |
ENDIF |
425 |
ELSE |
ELSE |
426 |
STOP 'GAD_CALC_RHS: Bad vertAdvecScheme (R)' |
STOP 'GAD_CALC_RHS: Bad vertAdvecScheme (R)' |
452 |
ENDDO |
ENDDO |
453 |
ENDDO |
ENDDO |
454 |
ELSE |
ELSE |
455 |
CALL GAD_DIFF_R(bi,bj,k,KappaR,tracer,df,myThid) |
CALL GAD_DIFF_R(bi,bj,k,KappaR,Tracer,df,myThid) |
456 |
ENDIF |
ENDIF |
457 |
|
|
458 |
#ifdef ALLOW_GMREDI |
#ifdef ALLOW_GMREDI |