11 |
C !INTERFACE: ========================================================== |
C !INTERFACE: ========================================================== |
12 |
SUBROUTINE GAD_ADVECTION( |
SUBROUTINE GAD_ADVECTION( |
13 |
I implicitAdvection, advectionScheme, vertAdvecScheme, |
I implicitAdvection, advectionScheme, vertAdvecScheme, |
14 |
I tracerIdentity, |
I tracerIdentity, deltaTLev, |
15 |
I uVel, vVel, wVel, tracer, |
I uVel, vVel, wVel, tracer, |
16 |
O gTracer, |
O gTracer, |
17 |
I bi,bj, myTime,myIter,myThid) |
I bi,bj, myTime,myIter,myThid) |
50 |
# endif |
# endif |
51 |
#endif |
#endif |
52 |
#ifdef ALLOW_EXCH2 |
#ifdef ALLOW_EXCH2 |
53 |
|
#include "W2_EXCH2_SIZE.h" |
54 |
#include "W2_EXCH2_TOPOLOGY.h" |
#include "W2_EXCH2_TOPOLOGY.h" |
|
#include "W2_EXCH2_PARAMS.h" |
|
55 |
#endif /* ALLOW_EXCH2 */ |
#endif /* ALLOW_EXCH2 */ |
56 |
|
|
57 |
C !INPUT PARAMETERS: =================================================== |
C !INPUT PARAMETERS: =================================================== |
70 |
LOGICAL implicitAdvection |
LOGICAL implicitAdvection |
71 |
INTEGER advectionScheme, vertAdvecScheme |
INTEGER advectionScheme, vertAdvecScheme |
72 |
INTEGER tracerIdentity |
INTEGER tracerIdentity |
73 |
|
_RL deltaTLev(Nr) |
74 |
_RL uVel (1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr,nSx,nSy) |
_RL uVel (1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr,nSx,nSy) |
75 |
_RL vVel (1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr,nSx,nSy) |
_RL vVel (1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr,nSx,nSy) |
76 |
_RL wVel (1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr,nSx,nSy) |
_RL wVel (1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr,nSx,nSy) |
251 |
#ifdef ALLOW_AUTODIFF_TAMC |
#ifdef ALLOW_AUTODIFF_TAMC |
252 |
kkey = (igadkey-1)*Nr + k |
kkey = (igadkey-1)*Nr + k |
253 |
CADJ STORE tracer(:,:,k,bi,bj) = |
CADJ STORE tracer(:,:,k,bi,bj) = |
254 |
CADJ & comlev1_bibj_k_gad, key=kkey, byte=isbyte |
CADJ & comlev1_bibj_k_gad, key=kkey, kind=isbyte |
255 |
#endif /* ALLOW_AUTODIFF_TAMC */ |
#endif /* ALLOW_AUTODIFF_TAMC */ |
256 |
|
|
257 |
C-- Get temporary terms used by tendency routines |
C-- Get temporary terms used by tendency routines |
344 |
#ifdef ALLOW_AUTODIFF_TAMC |
#ifdef ALLOW_AUTODIFF_TAMC |
345 |
# ifndef DISABLE_MULTIDIM_ADVECTION |
# ifndef DISABLE_MULTIDIM_ADVECTION |
346 |
CADJ STORE localTij(:,:) = |
CADJ STORE localTij(:,:) = |
347 |
CADJ & comlev1_bibj_k_gad_pass, key=passkey, byte=isbyte |
CADJ & comlev1_bibj_k_gad_pass, key=passkey, kind=isbyte |
348 |
CADJ STORE af(:,:) = |
CADJ STORE af(:,:) = |
349 |
CADJ & comlev1_bibj_k_gad_pass, key=passkey, byte=isbyte |
CADJ & comlev1_bibj_k_gad_pass, key=passkey, kind=isbyte |
350 |
# endif |
# endif |
351 |
#endif /* ALLOW_AUTODIFF_TAMC */ |
#endif /* ALLOW_AUTODIFF_TAMC */ |
352 |
C |
C |
363 |
#else |
#else |
364 |
IF ( overlapOnly ) THEN |
IF ( overlapOnly ) THEN |
365 |
#endif |
#endif |
366 |
CALL FILL_CS_CORNER_TR_RL( .TRUE., .FALSE., |
CALL FILL_CS_CORNER_TR_RL( 1, .FALSE., |
367 |
& localTij, bi,bj, myThid ) |
& localTij, bi,bj, myThid ) |
368 |
ENDIF |
ENDIF |
369 |
|
|
370 |
#ifdef ALLOW_AUTODIFF_TAMC |
#ifdef ALLOW_AUTODIFF_TAMC |
371 |
# ifndef DISABLE_MULTIDIM_ADVECTION |
# ifndef DISABLE_MULTIDIM_ADVECTION |
372 |
CADJ STORE localTij(:,:) = |
CADJ STORE localTij(:,:) = |
373 |
CADJ & comlev1_bibj_k_gad_pass, key=passkey, byte=isbyte |
CADJ & comlev1_bibj_k_gad_pass, key=passkey, kind=isbyte |
374 |
# endif |
# endif |
375 |
#endif /* ALLOW_AUTODIFF_TAMC */ |
#endif /* ALLOW_AUTODIFF_TAMC */ |
376 |
|
|
377 |
IF ( advectionScheme.EQ.ENUM_UPWIND_1RST |
IF ( advectionScheme.EQ.ENUM_UPWIND_1RST |
378 |
& .OR. advectionScheme.EQ.ENUM_DST2 ) THEN |
& .OR. advectionScheme.EQ.ENUM_DST2 ) THEN |
379 |
CALL GAD_DST2U1_ADV_X( bi,bj,k, advectionScheme, .TRUE., |
CALL GAD_DST2U1_ADV_X( bi,bj,k, advectionScheme, .TRUE., |
380 |
I dTtracerLev(k),uTrans,uFld,localTij, |
I deltaTLev(k),uTrans,uFld,localTij, |
381 |
O af, myThid ) |
O af, myThid ) |
382 |
ELSEIF (advectionScheme.EQ.ENUM_FLUX_LIMIT) THEN |
ELSEIF (advectionScheme.EQ.ENUM_FLUX_LIMIT) THEN |
383 |
CALL GAD_FLUXLIMIT_ADV_X( bi,bj,k, .TRUE., dTtracerLev(k), |
CALL GAD_FLUXLIMIT_ADV_X( bi,bj,k, .TRUE., deltaTLev(k), |
384 |
I uTrans, uFld, maskLocW, localTij, |
I uTrans, uFld, maskLocW, localTij, |
385 |
O af, myThid ) |
O af, myThid ) |
386 |
ELSEIF (advectionScheme.EQ.ENUM_DST3 ) THEN |
ELSEIF (advectionScheme.EQ.ENUM_DST3 ) THEN |
387 |
CALL GAD_DST3_ADV_X( bi,bj,k, .TRUE., dTtracerLev(k), |
CALL GAD_DST3_ADV_X( bi,bj,k, .TRUE., deltaTLev(k), |
388 |
I uTrans, uFld, maskLocW, localTij, |
I uTrans, uFld, maskLocW, localTij, |
389 |
O af, myThid ) |
O af, myThid ) |
390 |
ELSEIF (advectionScheme.EQ.ENUM_DST3_FLUX_LIMIT ) THEN |
ELSEIF (advectionScheme.EQ.ENUM_DST3_FLUX_LIMIT ) THEN |
391 |
CALL GAD_DST3FL_ADV_X( bi,bj,k, .TRUE., dTtracerLev(k), |
CALL GAD_DST3FL_ADV_X( bi,bj,k, .TRUE., deltaTLev(k), |
392 |
I uTrans, uFld, maskLocW, localTij, |
I uTrans, uFld, maskLocW, localTij, |
393 |
O af, myThid ) |
O af, myThid ) |
394 |
#ifndef ALLOW_AUTODIFF_TAMC |
#ifndef ALLOW_AUTODIFF_TAMC |
395 |
ELSEIF (advectionScheme.EQ.ENUM_OS7MP ) THEN |
ELSEIF (advectionScheme.EQ.ENUM_OS7MP ) THEN |
396 |
CALL GAD_OS7MP_ADV_X( bi,bj,k, .TRUE., dTtracerLev(k), |
CALL GAD_OS7MP_ADV_X( bi,bj,k, .TRUE., deltaTLev(k), |
397 |
I uTrans, uFld, maskLocW, localTij, |
I uTrans, uFld, maskLocW, localTij, |
398 |
O af, myThid ) |
O af, myThid ) |
399 |
#endif |
#endif |
403 |
|
|
404 |
C- Internal exchange for next calculations in Y |
C- Internal exchange for next calculations in Y |
405 |
IF ( overlapOnly .AND. ipass.EQ.1 ) THEN |
IF ( overlapOnly .AND. ipass.EQ.1 ) THEN |
406 |
CALL FILL_CS_CORNER_TR_RL( .FALSE., .FALSE., |
CALL FILL_CS_CORNER_TR_RL( 2, .FALSE., |
407 |
& localTij, bi,bj, myThid ) |
& localTij, bi,bj, myThid ) |
408 |
ENDIF |
ENDIF |
409 |
|
|
425 |
DO j=1-Oly,0 |
DO j=1-Oly,0 |
426 |
DO i=iMinUpd,iMaxUpd |
DO i=iMinUpd,iMaxUpd |
427 |
localTij(i,j) = localTij(i,j) |
localTij(i,j) = localTij(i,j) |
428 |
& -dTtracerLev(k)*recip_rhoFacC(k) |
& -deltaTLev(k)*recip_rhoFacC(k) |
429 |
& *_recip_hFacC(i,j,k,bi,bj)*recip_drF(k) |
& *_recip_hFacC(i,j,k,bi,bj)*recip_drF(k) |
430 |
& *recip_rA(i,j,bi,bj)*recip_deepFac2C(k) |
& *recip_rA(i,j,bi,bj)*recip_deepFac2C(k) |
431 |
& *( af(i+1,j)-af(i,j) |
& *( af(i+1,j)-af(i,j) |
438 |
DO j=sNy+1,sNy+Oly |
DO j=sNy+1,sNy+Oly |
439 |
DO i=iMinUpd,iMaxUpd |
DO i=iMinUpd,iMaxUpd |
440 |
localTij(i,j) = localTij(i,j) |
localTij(i,j) = localTij(i,j) |
441 |
& -dTtracerLev(k)*recip_rhoFacC(k) |
& -deltaTLev(k)*recip_rhoFacC(k) |
442 |
& *_recip_hFacC(i,j,k,bi,bj)*recip_drF(k) |
& *_recip_hFacC(i,j,k,bi,bj)*recip_drF(k) |
443 |
& *recip_rA(i,j,bi,bj)*recip_deepFac2C(k) |
& *recip_rA(i,j,bi,bj)*recip_deepFac2C(k) |
444 |
& *( af(i+1,j)-af(i,j) |
& *( af(i+1,j)-af(i,j) |
457 |
DO j=jMinUpd,jMaxUpd |
DO j=jMinUpd,jMaxUpd |
458 |
DO i=1-Olx+1,sNx+Olx-1 |
DO i=1-Olx+1,sNx+Olx-1 |
459 |
localTij(i,j) = localTij(i,j) |
localTij(i,j) = localTij(i,j) |
460 |
& -dTtracerLev(k)*recip_rhoFacC(k) |
& -deltaTLev(k)*recip_rhoFacC(k) |
461 |
& *_recip_hFacC(i,j,k,bi,bj)*recip_drF(k) |
& *_recip_hFacC(i,j,k,bi,bj)*recip_drF(k) |
462 |
& *recip_rA(i,j,bi,bj)*recip_deepFac2C(k) |
& *recip_rA(i,j,bi,bj)*recip_deepFac2C(k) |
463 |
& *( af(i+1,j)-af(i,j) |
& *( af(i+1,j)-af(i,j) |
507 |
#ifdef ALLOW_AUTODIFF_TAMC |
#ifdef ALLOW_AUTODIFF_TAMC |
508 |
# ifndef DISABLE_MULTIDIM_ADVECTION |
# ifndef DISABLE_MULTIDIM_ADVECTION |
509 |
CADJ STORE localTij(:,:) = |
CADJ STORE localTij(:,:) = |
510 |
CADJ & comlev1_bibj_k_gad_pass, key=passkey, byte=isbyte |
CADJ & comlev1_bibj_k_gad_pass, key=passkey, kind=isbyte |
511 |
CADJ STORE af(:,:) = |
CADJ STORE af(:,:) = |
512 |
CADJ & comlev1_bibj_k_gad_pass, key=passkey, byte=isbyte |
CADJ & comlev1_bibj_k_gad_pass, key=passkey, kind=isbyte |
513 |
# endif |
# endif |
514 |
#endif /* ALLOW_AUTODIFF_TAMC */ |
#endif /* ALLOW_AUTODIFF_TAMC */ |
515 |
C |
C |
526 |
#else |
#else |
527 |
IF ( overlapOnly ) THEN |
IF ( overlapOnly ) THEN |
528 |
#endif |
#endif |
529 |
CALL FILL_CS_CORNER_TR_RL( .FALSE., .FALSE., |
CALL FILL_CS_CORNER_TR_RL( 2, .FALSE., |
530 |
& localTij, bi,bj, myThid ) |
& localTij, bi,bj, myThid ) |
531 |
ENDIF |
ENDIF |
532 |
|
|
540 |
#ifdef ALLOW_AUTODIFF_TAMC |
#ifdef ALLOW_AUTODIFF_TAMC |
541 |
#ifndef DISABLE_MULTIDIM_ADVECTION |
#ifndef DISABLE_MULTIDIM_ADVECTION |
542 |
CADJ STORE localTij(:,:) = |
CADJ STORE localTij(:,:) = |
543 |
CADJ & comlev1_bibj_k_gad_pass, key=passkey, byte=isbyte |
CADJ & comlev1_bibj_k_gad_pass, key=passkey, kind=isbyte |
544 |
#endif |
#endif |
545 |
#endif /* ALLOW_AUTODIFF_TAMC */ |
#endif /* ALLOW_AUTODIFF_TAMC */ |
546 |
|
|
547 |
IF ( advectionScheme.EQ.ENUM_UPWIND_1RST |
IF ( advectionScheme.EQ.ENUM_UPWIND_1RST |
548 |
& .OR. advectionScheme.EQ.ENUM_DST2 ) THEN |
& .OR. advectionScheme.EQ.ENUM_DST2 ) THEN |
549 |
CALL GAD_DST2U1_ADV_Y( bi,bj,k, advectionScheme, .TRUE., |
CALL GAD_DST2U1_ADV_Y( bi,bj,k, advectionScheme, .TRUE., |
550 |
I dTtracerLev(k),vTrans,vFld,localTij, |
I deltaTLev(k),vTrans,vFld,localTij, |
551 |
O af, myThid ) |
O af, myThid ) |
552 |
ELSEIF (advectionScheme.EQ.ENUM_FLUX_LIMIT) THEN |
ELSEIF (advectionScheme.EQ.ENUM_FLUX_LIMIT) THEN |
553 |
CALL GAD_FLUXLIMIT_ADV_Y( bi,bj,k, .TRUE., dTtracerLev(k), |
CALL GAD_FLUXLIMIT_ADV_Y( bi,bj,k, .TRUE., deltaTLev(k), |
554 |
I vTrans, vFld, maskLocS, localTij, |
I vTrans, vFld, maskLocS, localTij, |
555 |
O af, myThid ) |
O af, myThid ) |
556 |
ELSEIF (advectionScheme.EQ.ENUM_DST3 ) THEN |
ELSEIF (advectionScheme.EQ.ENUM_DST3 ) THEN |
557 |
CALL GAD_DST3_ADV_Y( bi,bj,k, .TRUE., dTtracerLev(k), |
CALL GAD_DST3_ADV_Y( bi,bj,k, .TRUE., deltaTLev(k), |
558 |
I vTrans, vFld, maskLocS, localTij, |
I vTrans, vFld, maskLocS, localTij, |
559 |
O af, myThid ) |
O af, myThid ) |
560 |
ELSEIF (advectionScheme.EQ.ENUM_DST3_FLUX_LIMIT ) THEN |
ELSEIF (advectionScheme.EQ.ENUM_DST3_FLUX_LIMIT ) THEN |
561 |
CALL GAD_DST3FL_ADV_Y( bi,bj,k, .TRUE., dTtracerLev(k), |
CALL GAD_DST3FL_ADV_Y( bi,bj,k, .TRUE., deltaTLev(k), |
562 |
I vTrans, vFld, maskLocS, localTij, |
I vTrans, vFld, maskLocS, localTij, |
563 |
O af, myThid ) |
O af, myThid ) |
564 |
#ifndef ALLOW_AUTODIFF_TAMC |
#ifndef ALLOW_AUTODIFF_TAMC |
565 |
ELSEIF (advectionScheme.EQ.ENUM_OS7MP ) THEN |
ELSEIF (advectionScheme.EQ.ENUM_OS7MP ) THEN |
566 |
CALL GAD_OS7MP_ADV_Y( bi,bj,k, .TRUE., dTtracerLev(k), |
CALL GAD_OS7MP_ADV_Y( bi,bj,k, .TRUE., deltaTLev(k), |
567 |
I vTrans, vFld, maskLocS, localTij, |
I vTrans, vFld, maskLocS, localTij, |
568 |
O af, myThid ) |
O af, myThid ) |
569 |
#endif |
#endif |
573 |
|
|
574 |
C- Internal exchange for next calculations in X |
C- Internal exchange for next calculations in X |
575 |
IF ( overlapOnly .AND. ipass.EQ.1 ) THEN |
IF ( overlapOnly .AND. ipass.EQ.1 ) THEN |
576 |
CALL FILL_CS_CORNER_TR_RL( .TRUE., .FALSE., |
CALL FILL_CS_CORNER_TR_RL( 1, .FALSE., |
577 |
& localTij, bi,bj, myThid ) |
& localTij, bi,bj, myThid ) |
578 |
ENDIF |
ENDIF |
579 |
|
|
595 |
DO j=jMinUpd,jMaxUpd |
DO j=jMinUpd,jMaxUpd |
596 |
DO i=1-Olx,0 |
DO i=1-Olx,0 |
597 |
localTij(i,j) = localTij(i,j) |
localTij(i,j) = localTij(i,j) |
598 |
& -dTtracerLev(k)*recip_rhoFacC(k) |
& -deltaTLev(k)*recip_rhoFacC(k) |
599 |
& *_recip_hFacC(i,j,k,bi,bj)*recip_drF(k) |
& *_recip_hFacC(i,j,k,bi,bj)*recip_drF(k) |
600 |
& *recip_rA(i,j,bi,bj)*recip_deepFac2C(k) |
& *recip_rA(i,j,bi,bj)*recip_deepFac2C(k) |
601 |
& *( af(i,j+1)-af(i,j) |
& *( af(i,j+1)-af(i,j) |
608 |
DO j=jMinUpd,jMaxUpd |
DO j=jMinUpd,jMaxUpd |
609 |
DO i=sNx+1,sNx+Olx |
DO i=sNx+1,sNx+Olx |
610 |
localTij(i,j) = localTij(i,j) |
localTij(i,j) = localTij(i,j) |
611 |
& -dTtracerLev(k)*recip_rhoFacC(k) |
& -deltaTLev(k)*recip_rhoFacC(k) |
612 |
& *_recip_hFacC(i,j,k,bi,bj)*recip_drF(k) |
& *_recip_hFacC(i,j,k,bi,bj)*recip_drF(k) |
613 |
& *recip_rA(i,j,bi,bj)*recip_deepFac2C(k) |
& *recip_rA(i,j,bi,bj)*recip_deepFac2C(k) |
614 |
& *( af(i,j+1)-af(i,j) |
& *( af(i,j+1)-af(i,j) |
627 |
DO j=1-Oly+1,sNy+Oly-1 |
DO j=1-Oly+1,sNy+Oly-1 |
628 |
DO i=iMinUpd,iMaxUpd |
DO i=iMinUpd,iMaxUpd |
629 |
localTij(i,j) = localTij(i,j) |
localTij(i,j) = localTij(i,j) |
630 |
& -dTtracerLev(k)*recip_rhoFacC(k) |
& -deltaTLev(k)*recip_rhoFacC(k) |
631 |
& *_recip_hFacC(i,j,k,bi,bj)*recip_drF(k) |
& *_recip_hFacC(i,j,k,bi,bj)*recip_drF(k) |
632 |
& *recip_rA(i,j,bi,bj)*recip_deepFac2C(k) |
& *recip_rA(i,j,bi,bj)*recip_deepFac2C(k) |
633 |
& *( af(i,j+1)-af(i,j) |
& *( af(i,j+1)-af(i,j) |
672 |
DO j=1-Oly,sNy+Oly |
DO j=1-Oly,sNy+Oly |
673 |
DO i=1-Olx,sNx+Olx |
DO i=1-Olx,sNx+Olx |
674 |
gTracer(i,j,k,bi,bj)= |
gTracer(i,j,k,bi,bj)= |
675 |
& (localTij(i,j)-tracer(i,j,k,bi,bj))/dTtracerLev(k) |
& (localTij(i,j)-tracer(i,j,k,bi,bj))/deltaTLev(k) |
676 |
ENDDO |
ENDDO |
677 |
ENDDO |
ENDDO |
678 |
ELSE |
ELSE |
727 |
|
|
728 |
#ifdef ALLOW_AUTODIFF_TAMC |
#ifdef ALLOW_AUTODIFF_TAMC |
729 |
CADJ STORE rtrans(:,:) = |
CADJ STORE rtrans(:,:) = |
730 |
CADJ & comlev1_bibj_k_gad, key=kkey, byte=isbyte |
CADJ & comlev1_bibj_k_gad, key=kkey, kind=isbyte |
731 |
cphCADJ STORE wfld(:,:) = |
cphCADJ STORE wfld(:,:) = |
732 |
cphCADJ & comlev1_bibj_k_gad, key=kkey, byte=isbyte |
cphCADJ & comlev1_bibj_k_gad, key=kkey, kind=isbyte |
733 |
#endif |
#endif |
734 |
|
|
735 |
C-- Compute Vertical transport |
C-- Compute Vertical transport |
744 |
|
|
745 |
#ifdef ALLOW_AUTODIFF_TAMC |
#ifdef ALLOW_AUTODIFF_TAMC |
746 |
cphmultiCADJ STORE wfld(:,:) = |
cphmultiCADJ STORE wfld(:,:) = |
747 |
cphmultiCADJ & comlev1_bibj_k_gad, key=kkey, byte=isbyte |
cphmultiCADJ & comlev1_bibj_k_gad, key=kkey, kind=isbyte |
748 |
#endif /* ALLOW_AUTODIFF_TAMC */ |
#endif /* ALLOW_AUTODIFF_TAMC */ |
749 |
|
|
750 |
C- Surface interface : |
C- Surface interface : |
761 |
|
|
762 |
#ifdef ALLOW_AUTODIFF_TAMC |
#ifdef ALLOW_AUTODIFF_TAMC |
763 |
cphmultiCADJ STORE wfld(:,:) = |
cphmultiCADJ STORE wfld(:,:) = |
764 |
cphmultiCADJ & comlev1_bibj_k_gad, key=kkey, byte=isbyte |
cphmultiCADJ & comlev1_bibj_k_gad, key=kkey, kind=isbyte |
765 |
#endif /* ALLOW_AUTODIFF_TAMC */ |
#endif /* ALLOW_AUTODIFF_TAMC */ |
766 |
|
|
767 |
C- Interior interface : |
C- Interior interface : |
786 |
|
|
787 |
#ifdef ALLOW_AUTODIFF_TAMC |
#ifdef ALLOW_AUTODIFF_TAMC |
788 |
cphmultiCADJ STORE localTijk(:,:,k) |
cphmultiCADJ STORE localTijk(:,:,k) |
789 |
cphmultiCADJ & = comlev1_bibj_k_gad, key=kkey, byte=isbyte |
cphmultiCADJ & = comlev1_bibj_k_gad, key=kkey, kind=isbyte |
790 |
cphmultiCADJ STORE rTrans(:,:) |
cphmultiCADJ STORE rTrans(:,:) |
791 |
cphmultiCADJ & = comlev1_bibj_k_gad, key=kkey, byte=isbyte |
cphmultiCADJ & = comlev1_bibj_k_gad, key=kkey, kind=isbyte |
792 |
#endif /* ALLOW_AUTODIFF_TAMC */ |
#endif /* ALLOW_AUTODIFF_TAMC */ |
793 |
|
|
794 |
C- Compute vertical advective flux in the interior: |
C- Compute vertical advective flux in the interior: |
795 |
IF ( vertAdvecScheme.EQ.ENUM_UPWIND_1RST |
IF ( vertAdvecScheme.EQ.ENUM_UPWIND_1RST |
796 |
& .OR. vertAdvecScheme.EQ.ENUM_DST2 ) THEN |
& .OR. vertAdvecScheme.EQ.ENUM_DST2 ) THEN |
797 |
CALL GAD_DST2U1_ADV_R( bi,bj,k, advectionScheme, |
CALL GAD_DST2U1_ADV_R( bi,bj,k, advectionScheme, |
798 |
I dTtracerLev(k),rTrans,wFld,localTijk, |
I deltaTLev(k),rTrans,wFld,localTijk, |
799 |
O fVerT(1-Olx,1-Oly,kUp), myThid ) |
O fVerT(1-Olx,1-Oly,kUp), myThid ) |
800 |
ELSEIF( vertAdvecScheme.EQ.ENUM_FLUX_LIMIT) THEN |
ELSEIF( vertAdvecScheme.EQ.ENUM_FLUX_LIMIT) THEN |
801 |
CALL GAD_FLUXLIMIT_ADV_R( bi,bj,k, dTtracerLev(k), |
CALL GAD_FLUXLIMIT_ADV_R( bi,bj,k, deltaTLev(k), |
802 |
I rTrans, wFld, localTijk, |
I rTrans, wFld, localTijk, |
803 |
O fVerT(1-Olx,1-Oly,kUp), myThid ) |
O fVerT(1-Olx,1-Oly,kUp), myThid ) |
804 |
ELSEIF( vertAdvecScheme.EQ.ENUM_DST3 ) THEN |
ELSEIF( vertAdvecScheme.EQ.ENUM_DST3 ) THEN |
805 |
CALL GAD_DST3_ADV_R( bi,bj,k, dTtracerLev(k), |
CALL GAD_DST3_ADV_R( bi,bj,k, deltaTLev(k), |
806 |
I rTrans, wFld, localTijk, |
I rTrans, wFld, localTijk, |
807 |
O fVerT(1-Olx,1-Oly,kUp), myThid ) |
O fVerT(1-Olx,1-Oly,kUp), myThid ) |
808 |
ELSEIF( vertAdvecScheme.EQ.ENUM_DST3_FLUX_LIMIT ) THEN |
ELSEIF( vertAdvecScheme.EQ.ENUM_DST3_FLUX_LIMIT ) THEN |
809 |
CALL GAD_DST3FL_ADV_R( bi,bj,k, dTtracerLev(k), |
CALL GAD_DST3FL_ADV_R( bi,bj,k, deltaTLev(k), |
810 |
I rTrans, wFld, localTijk, |
I rTrans, wFld, localTijk, |
811 |
O fVerT(1-Olx,1-Oly,kUp), myThid ) |
O fVerT(1-Olx,1-Oly,kUp), myThid ) |
812 |
#ifndef ALLOW_AUTODIFF_TAMC |
#ifndef ALLOW_AUTODIFF_TAMC |
813 |
ELSEIF (vertAdvecScheme.EQ.ENUM_OS7MP ) THEN |
ELSEIF (vertAdvecScheme.EQ.ENUM_OS7MP ) THEN |
814 |
CALL GAD_OS7MP_ADV_R( bi,bj,k, dTtracerLev(k), |
CALL GAD_OS7MP_ADV_R( bi,bj,k, deltaTLev(k), |
815 |
I rTrans, wFld, localTijk, |
I rTrans, wFld, localTijk, |
816 |
O fVerT(1-Olx,1-Oly,kUp), myThid ) |
O fVerT(1-Olx,1-Oly,kUp), myThid ) |
817 |
#endif |
#endif |
824 |
|
|
825 |
#ifdef ALLOW_AUTODIFF_TAMC |
#ifdef ALLOW_AUTODIFF_TAMC |
826 |
cphmultiCADJ STORE rTrans(:,:) |
cphmultiCADJ STORE rTrans(:,:) |
827 |
cphmultiCADJ & = comlev1_bibj_k_gad, key=kkey, byte=isbyte |
cphmultiCADJ & = comlev1_bibj_k_gad, key=kkey, kind=isbyte |
828 |
cphmultiCADJ STORE rTranskp1(:,:) |
cphmultiCADJ STORE rTranskp1(:,:) |
829 |
cphmultiCADJ & = comlev1_bibj_k_gad, key=kkey, byte=isbyte |
cphmultiCADJ & = comlev1_bibj_k_gad, key=kkey, kind=isbyte |
830 |
cph --- following storing of fVerT is critical for correct |
cph --- following storing of fVerT is critical for correct |
831 |
cph --- gradient with multiDimAdvection |
cph --- gradient with multiDimAdvection |
832 |
cph --- Without it, kDown component is not properly recomputed |
cph --- Without it, kDown component is not properly recomputed |
833 |
cph --- This is a TAF bug (and no warning available) |
cph --- This is a TAF bug (and no warning available) |
834 |
CADJ STORE fVerT(:,:,:) |
CADJ STORE fVerT(:,:,:) |
835 |
CADJ & = comlev1_bibj_k_gad, key=kkey, byte=isbyte |
CADJ & = comlev1_bibj_k_gad, key=kkey, kind=isbyte |
836 |
#endif /* ALLOW_AUTODIFF_TAMC */ |
#endif /* ALLOW_AUTODIFF_TAMC */ |
837 |
|
|
838 |
C-- Divergence of vertical fluxes |
C-- Divergence of vertical fluxes |
839 |
DO j=1-Oly,sNy+Oly |
DO j=1-Oly,sNy+Oly |
840 |
DO i=1-Olx,sNx+Olx |
DO i=1-Olx,sNx+Olx |
841 |
localTij(i,j) = localTijk(i,j,k) |
localTij(i,j) = localTijk(i,j,k) |
842 |
& -dTtracerLev(k)*recip_rhoFacC(k) |
& -deltaTLev(k)*recip_rhoFacC(k) |
843 |
& *_recip_hFacC(i,j,k,bi,bj)*recip_drF(k) |
& *_recip_hFacC(i,j,k,bi,bj)*recip_drF(k) |
844 |
& *recip_rA(i,j,bi,bj)*recip_deepFac2C(k) |
& *recip_rA(i,j,bi,bj)*recip_deepFac2C(k) |
845 |
& *( fVerT(i,j,kDown)-fVerT(i,j,kUp) |
& *( fVerT(i,j,kDown)-fVerT(i,j,kUp) |
846 |
& -tracer(i,j,k,bi,bj)*(rTransKp1(i,j)-rTrans(i,j)) |
& -tracer(i,j,k,bi,bj)*(rTransKp1(i,j)-rTrans(i,j)) |
847 |
& )*rkSign |
& )*rkSign |
848 |
gTracer(i,j,k,bi,bj)= |
gTracer(i,j,k,bi,bj)= |
849 |
& (localTij(i,j)-tracer(i,j,k,bi,bj))/dTtracerLev(k) |
& (localTij(i,j)-tracer(i,j,k,bi,bj))/deltaTLev(k) |
850 |
ENDDO |
ENDDO |
851 |
ENDDO |
ENDDO |
852 |
|
|