New URL for NEMO forge!   http://forge.nemo-ocean.eu

Since March 2022 along with NEMO 4.2 release, the code development moved to a self-hosted GitLab.
This present forge is now archived and remained online for history.
Changeset 2528 for trunk/NEMOGCM/NEMO/OPA_SRC/TRA/traadv_ubs.F90 – NEMO

Ignore:
Timestamp:
2010-12-27T18:33:53+01:00 (13 years ago)
Author:
rblod
Message:

Update NEMOGCM from branch nemo_v3_3_beta

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/NEMOGCM/NEMO/OPA_SRC/TRA/traadv_ubs.F90

    • Property svn:eol-style deleted
    r1528 r2528  
    44   !! Ocean active tracers:  horizontal & vertical advective trend 
    55   !!============================================================================== 
    6    !! History :  9.0  !  06-08  (L. Debreu, R. Benshila)  Original code 
     6   !! History :  1.0  !  2006-08  (L. Debreu, R. Benshila)  Original code 
     7   !!            3.3  !  2010-05  (C. Ethe, G. Madec)  merge TRC-TRA + switch from velocity to transport 
    78   !!---------------------------------------------------------------------- 
    89 
     
    1314   USE oce             ! ocean dynamics and active tracers 
    1415   USE dom_oce         ! ocean space and time domain 
    15    USE trdmod 
    16    USE trdmod_oce 
     16   USE trdmod_oce         ! ocean space and time domain 
     17   USE trdtra 
    1718   USE lib_mpp 
    1819   USE lbclnk          ! ocean lateral boundary condition (or mpp link) 
     
    2021   USE diaptr          ! poleward transport diagnostics 
    2122   USE dynspg_oce      ! choice/control of key cpp for surface pressure gradient 
    22    USE prtctl 
     23   USE trc_oce         ! share passive tracers/Ocean variables 
    2324 
    2425   IMPLICIT NONE 
     
    2728   PUBLIC   tra_adv_ubs   ! routine called by traadv module 
    2829 
    29    REAL(wp), DIMENSION(jpi,jpj) ::   e1e2tr   ! = 1/(e1t * e2t) 
     30   LOGICAL :: l_trd  ! flag to compute trends or not 
    3031 
    3132   !! * Substitutions 
     
    3334#  include "vectopt_loop_substitute.h90" 
    3435   !!---------------------------------------------------------------------- 
    35    !!   OPA 9.0 , LOCEAN-IPSL (2006)   
     36   !! NEMO/OPA 3.3 , NEMO Consortium (2010) 
    3637   !! $Id$ 
    37    !! Software governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt)  
    38    !!---------------------------------------------------------------------- 
    39  
     38   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt) 
     39   !!---------------------------------------------------------------------- 
    4040CONTAINS 
    4141 
    42    SUBROUTINE tra_adv_ubs( kt, pun, pvn, pwn ) 
     42   SUBROUTINE tra_adv_ubs ( kt, cdtype, p2dt, pun, pvn, pwn,      & 
     43      &                                       ptb, ptn, pta, kjpt ) 
    4344      !!---------------------------------------------------------------------- 
    4445      !!                  ***  ROUTINE tra_adv_ubs  *** 
     
    6768      !!      the UBS have been found to be too diffusive. 
    6869      !! 
    69       !! ** Action : - update (ta,sa) with the now advective tracer trends 
     70      !! ** Action : - update (pta) with the now advective tracer trends 
    7071      !! 
    7172      !! Reference : Shchepetkin, A. F., J. C. McWilliams, 2005, Ocean Modelling, 9, 347-404.  
    7273      !!             Farrow, D.E., Stevens, D.P., 1995, J. Phys. Ocean. 25, 1731Ð1741.  
    7374      !!---------------------------------------------------------------------- 
    74       USE oce, ONLY :   zwx => ua   ! use ua as workspace 
    75       USE oce, ONLY :   zwy => va   ! use va as workspace 
    76       !! 
    77       INTEGER , INTENT(in)                         ::   kt             ! ocean time-step index 
    78       REAL(wp), INTENT(in), DIMENSION(jpi,jpj,jpk) ::  pun   ! effective ocean velocity, u_component 
    79       REAL(wp), INTENT(in), DIMENSION(jpi,jpj,jpk) ::  pvn   ! effective ocean velocity, v_component 
    80       REAL(wp), INTENT(in), DIMENSION(jpi,jpj,jpk) ::  pwn   ! effective ocean velocity, w_component 
    81       !! 
    82       INTEGER  ::   ji, jj, jk                 ! dummy loop indices 
    83       REAL(wp) ::   zta, zsa, zbtr, zcoef                  ! temporary scalars 
    84       REAL(wp) ::   zfui, zfp_ui, zfm_ui, zcenut, zcenus   !    "         " 
    85       REAL(wp) ::   zfvj, zfp_vj, zfm_vj, zcenvt, zcenvs   !    "         " 
    86       REAL(wp) ::   z_hdivn_x, z_hdivn_y, z_hdivn          !    "         " 
    87       REAL(wp), DIMENSION(jpi,jpj)     ::   zeeu, zeev     ! temporary 2D workspace 
    88       REAL(wp), DIMENSION(jpi,jpj,jpk) ::   zwz , zww                        ! temporary 3D workspace 
    89       REAL(wp), DIMENSION(jpi,jpj,jpk) ::   ztu , ztv , zltu , zltv, ztrdt   !    "              " 
    90       REAL(wp), DIMENSION(jpi,jpj,jpk) ::   zsu , zsv , zlsu , zlsv, ztrds   !    "              " 
    91       !!---------------------------------------------------------------------- 
    92  
    93       zltu(:,:,:) = 0.e0 
    94       zltv(:,:,:) = 0.e0 
    95       zlsu(:,:,:) = 0.e0 
    96       zlsv(:,:,:) = 0.e0 
    97  
    98       IF( kt == nit000 ) THEN 
     75      USE oce         , zwx => ua   ! use ua as workspace 
     76      USE oce         , zwy => va   ! use va as workspace 
     77      !! 
     78      INTEGER                              , INTENT(in   ) ::   kt              ! ocean time-step index 
     79      CHARACTER(len=3)                     , INTENT(in   ) ::   cdtype          ! =TRA or TRC (tracer indicator) 
     80      INTEGER                              , INTENT(in   ) ::   kjpt            ! number of tracers 
     81      REAL(wp), DIMENSION(        jpk     ), INTENT(in   ) ::   p2dt            ! vertical profile of tracer time-step 
     82      REAL(wp), DIMENSION(jpi,jpj,jpk     ), INTENT(in   ) ::   pun, pvn, pwn   ! 3 ocean velocity components 
     83      REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(in   ) ::   ptb, ptn        ! before and now tracer fields 
     84      REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) ::   pta             ! tracer trend  
     85      !! 
     86      INTEGER  ::   ji, jj, jk, jn          ! dummy loop indices 
     87      REAL(wp) ::   ztra, zbtr, zcoef       ! local scalars 
     88      REAL(wp) ::   zfp_ui, zfm_ui, zcenut  !   -      - 
     89      REAL(wp) ::   zfp_vj, zfm_vj, zcenvt  !   -      - 
     90      REAL(wp) ::   z2dtt                   !   -      - 
     91      REAL(wp) ::   ztak, zfp_wk, zfm_wk    !   -      - 
     92      REAL(wp) ::   zeeu, zeev, z_hdivn     !   -      - 
     93      REAL(wp), DIMENSION(jpi,jpj,jpk) :: ztu, ztv, zltu , zltv   ! 3D workspace 
     94      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zti, ztw                !  -      - 
     95      !!---------------------------------------------------------------------- 
     96 
     97      IF( kt == nit000 )  THEN 
    9998         IF(lwp) WRITE(numout,*) 
    100          IF(lwp) WRITE(numout,*) 'tra_adv_ubs :  horizontal UBS advection scheme' 
     99         IF(lwp) WRITE(numout,*) 'tra_adv_ubs :  horizontal UBS advection scheme on ', cdtype 
    101100         IF(lwp) WRITE(numout,*) '~~~~~~~~~~~~' 
    102101         ! 
    103          e1e2tr(:,:) = 1. / ( e1t(:,:) * e2t(:,:) ) 
     102         l_trd = .FALSE. 
     103         IF( ( cdtype == 'TRA' .AND. l_trdtra ) .OR. ( cdtype == 'TRC' .AND. l_trdtrc ) ) l_trd = .TRUE. 
    104104      ENDIF 
    105  
    106       ! Save ta and sa trends 
    107       ztrdt(:,:,:) = ta(:,:,:) 
    108       ztrds(:,:,:) = sa(:,:,:) 
    109  
    110       zcoef = 1./6. 
    111       !                                                ! =============== 
    112       DO jk = 1, jpkm1                                 ! Horizontal slab 
    113          !                                             ! =============== 
    114  
    115          !  Initialization of metric arrays (for z- or s-coordinates) 
    116          DO jj = 1, jpjm1 
    117             DO ji = 1, fs_jpim1   ! vector opt. 
    118 #if defined key_zco 
    119                ! z-coordinates, no vertical scale factors 
    120                zeeu(ji,jj) = e2u(ji,jj) / e1u(ji,jj) * umask(ji,jj,jk) 
    121                zeev(ji,jj) = e1v(ji,jj) / e2v(ji,jj) * vmask(ji,jj,jk) 
    122 #else 
    123                ! s-coordinates, vertical scale factor are used 
    124                zeeu(ji,jj) = e2u(ji,jj) * fse3u(ji,jj,jk) / e1u(ji,jj) * umask(ji,jj,jk) 
    125                zeev(ji,jj) = e1v(ji,jj) * fse3v(ji,jj,jk) / e2v(ji,jj) * vmask(ji,jj,jk) 
    126 #endif 
    127             END DO 
    128          END DO 
    129  
    130          !  Laplacian 
    131          ! First derivative (gradient) 
    132          DO jj = 1, jpjm1 
    133             DO ji = 1, fs_jpim1   ! vector opt. 
    134                ztu(ji,jj,jk) = zeeu(ji,jj) * ( tb(ji+1,jj  ,jk) - tb(ji,jj,jk) ) 
    135                zsu(ji,jj,jk) = zeeu(ji,jj) * ( sb(ji+1,jj  ,jk) - sb(ji,jj,jk) ) 
    136                ztv(ji,jj,jk) = zeev(ji,jj) * ( tb(ji  ,jj+1,jk) - tb(ji,jj,jk) ) 
    137                zsv(ji,jj,jk) = zeev(ji,jj) * ( sb(ji  ,jj+1,jk) - sb(ji,jj,jk) ) 
    138             END DO 
    139          END DO 
    140          ! Second derivative (divergence) 
    141          DO jj = 2, jpjm1 
    142             DO ji = fs_2, fs_jpim1   ! vector opt. 
    143 #if ! defined key_zco 
    144                zcoef = 1. / ( 6. * fse3t(ji,jj,jk) ) 
    145 #endif          
    146                zltu(ji,jj,jk) = (  ztu(ji,jj,jk) - ztu(ji-1,jj,jk)  ) * zcoef 
    147                zlsu(ji,jj,jk) = (  zsu(ji,jj,jk) - zsu(ji-1,jj,jk)  ) * zcoef 
    148                zltv(ji,jj,jk) = (  ztv(ji,jj,jk) - ztv(ji,jj-1,jk)  ) * zcoef 
    149                zlsv(ji,jj,jk) = (  zsv(ji,jj,jk) - zsv(ji,jj-1,jk)  ) * zcoef 
    150             END DO 
    151          END DO 
    152          !                                             ! ================= 
    153       END DO                                           !    End of slab 
    154       !                                                ! ================= 
    155  
    156       ! Lateral boundary conditions on the laplacian (zlt,zls)   (unchanged sgn) 
    157       CALL lbc_lnk( zltu, 'T', 1. )   ;    CALL lbc_lnk( zlsu, 'T', 1. ) 
    158       CALL lbc_lnk( zltv, 'T', 1. )   ;    CALL lbc_lnk( zlsv, 'T', 1. ) 
    159  
    160       !                                                ! =============== 
    161       DO jk = 1, jpkm1                                 ! Horizontal slab 
    162          !                                             ! =============== 
    163          !  Horizontal advective fluxes 
    164          DO jj = 1, jpjm1 
    165             DO ji = 1, fs_jpim1   ! vector opt. 
    166                ! volume fluxes * 1/2 
    167 #if defined key_zco 
    168                zfui = 0.5 * e2u(ji,jj) * pun(ji,jj,jk) 
    169                zfvj = 0.5 * e1v(ji,jj) * pvn(ji,jj,jk) 
    170 #else 
    171                zfui = 0.5 * e2u(ji,jj) * fse3u(ji,jj,jk) * pun(ji,jj,jk) 
    172                zfvj = 0.5 * e1v(ji,jj) * fse3v(ji,jj,jk) * pvn(ji,jj,jk) 
    173 #endif 
    174                ! upstream scheme 
    175                zfp_ui = zfui + ABS( zfui ) 
    176                zfp_vj = zfvj + ABS( zfvj ) 
    177                zfm_ui = zfui - ABS( zfui ) 
    178                zfm_vj = zfvj - ABS( zfvj ) 
    179                ! centered scheme 
    180                zcenut = zfui * ( tn(ji,jj,jk) + tn(ji+1,jj  ,jk) ) 
    181                zcenvt = zfvj * ( tn(ji,jj,jk) + tn(ji  ,jj+1,jk) ) 
    182                zcenus = zfui * ( sn(ji,jj,jk) + sn(ji+1,jj  ,jk) ) 
    183                zcenvs = zfvj * ( sn(ji,jj,jk) + sn(ji  ,jj+1,jk) ) 
    184                ! mixed centered / upstream scheme 
    185                zwx(ji,jj,jk) = zcenut - zfp_ui * zltu(ji,jj,jk) -zfm_ui * zltu(ji+1,jj,jk) 
    186                zwy(ji,jj,jk) = zcenvt - zfp_vj * zltv(ji,jj,jk) -zfm_vj * zltv(ji,jj+1,jk) 
    187                zww(ji,jj,jk) = zcenus - zfp_ui * zlsu(ji,jj,jk) -zfm_ui * zlsu(ji+1,jj,jk) 
    188                zwz(ji,jj,jk) = zcenvs - zfp_vj * zlsv(ji,jj,jk) -zfm_vj * zlsv(ji,jj+1,jk) 
    189             END DO 
    190          END DO 
    191  
    192          !  Tracer flux divergence at t-point added to the general trend 
    193          DO jj = 2, jpjm1 
    194             DO ji = fs_2, fs_jpim1   ! vector opt. 
    195                ! horizontal advective trends 
    196 #if defined key_zco 
    197                zbtr = e1e2tr(ji,jj) 
    198 #else 
    199                zbtr = e1e2tr(ji,jj) / fse3t(ji,jj,jk) 
    200 #endif 
    201                zta = - zbtr * (  zwx(ji,jj,jk) - zwx(ji-1,jj  ,jk)   & 
    202                   &            + zwy(ji,jj,jk) - zwy(ji  ,jj-1,jk)  ) 
    203                zsa = - zbtr * (  zww(ji,jj,jk) - zww(ji-1,jj  ,jk)   & 
    204                   &            + zwz(ji,jj,jk) - zwz(ji  ,jj-1,jk)  ) 
    205                ! add it to the general tracer trends 
    206                ta(ji,jj,jk) = ta(ji,jj,jk) + zta 
    207                sa(ji,jj,jk) = sa(ji,jj,jk) + zsa 
    208             END DO 
    209          END DO 
    210          !                                             ! =============== 
    211       END DO                                           !   End of slab 
    212       !                                                ! =============== 
    213  
    214       ! Horizontal trend used in tra_adv_ztvd subroutine 
    215       zltu(:,:,:) = ta(:,:,:) - ztrdt(:,:,:)  
    216       zlsu(:,:,:) = sa(:,:,:) - ztrds(:,:,:)  
    217  
    218       ! 3. Save the horizontal advective trends for diagnostic 
    219       ! ------------------------------------------------------ 
    220       IF( l_trdtra )   THEN 
    221          ! Recompute the hoizontal advection zta & zsa trends computed  
    222          ! at the step 2. above in making the difference between the new  
    223          ! trends and the previous one ta()/sa - ztrdt()/ztrds() and add 
    224          ! the term tn()/sn()*hdivn() to recover the Uh gradh(T/S) trends 
    225          ztrdt(:,:,:) = 0.e0   ;   ztrds(:,:,:) = 0.e0 
    226          ! 
    227          ! T/S ZONAL advection trends 
     105      ! 
     106      !                                                          ! =========== 
     107      DO jn = 1, kjpt                                            ! tracer loop 
     108         !                                                       ! =========== 
     109         ! 1. Bottom value : flux set to zero 
     110         ! ---------------------------------- 
     111         zltu(:,:,jpk) = 0.e0       ;      zltv(:,:,jpk) = 0.e0 
     112         !                                               
     113         DO jk = 1, jpkm1                                 ! Horizontal slab 
     114            !                                    
     115            !  Laplacian 
     116            DO jj = 1, jpjm1            ! First derivative (gradient) 
     117               DO ji = 1, fs_jpim1   ! vector opt. 
     118                  zeeu = e2u(ji,jj) * fse3u(ji,jj,jk) / e1u(ji,jj) * umask(ji,jj,jk) 
     119                  zeev = e1v(ji,jj) * fse3v(ji,jj,jk) / e2v(ji,jj) * vmask(ji,jj,jk) 
     120                  ztu(ji,jj,jk) = zeeu * ( ptb(ji+1,jj  ,jk,jn) - ptb(ji,jj,jk,jn) ) 
     121                  ztv(ji,jj,jk) = zeev * ( ptb(ji  ,jj+1,jk,jn) - ptb(ji,jj,jk,jn) ) 
     122               END DO 
     123            END DO 
     124            DO jj = 2, jpjm1            ! Second derivative (divergence) 
     125               DO ji = fs_2, fs_jpim1   ! vector opt. 
     126                  zcoef = 1. / ( 6. * fse3t(ji,jj,jk) ) 
     127                  zltu(ji,jj,jk) = (  ztu(ji,jj,jk) - ztu(ji-1,jj,jk)  ) * zcoef 
     128                  zltv(ji,jj,jk) = (  ztv(ji,jj,jk) - ztv(ji,jj-1,jk)  ) * zcoef 
     129               END DO 
     130            END DO 
     131            !                                     
     132         END DO                                           ! End of slab          
     133         CALL lbc_lnk( zltu, 'T', 1. )   ;    CALL lbc_lnk( zltv, 'T', 1. )   ! Lateral boundary cond. (unchanged sgn) 
     134 
     135         !     
     136         !  Horizontal advective fluxes                
     137         DO jk = 1, jpkm1                                 ! Horizontal slab 
     138            DO jj = 1, jpjm1 
     139               DO ji = 1, fs_jpim1   ! vector opt. 
     140                  ! upstream transport 
     141                  zfp_ui = pun(ji,jj,jk) + ABS( pun(ji,jj,jk) ) 
     142                  zfm_ui = pun(ji,jj,jk) - ABS( pun(ji,jj,jk) ) 
     143                  zfp_vj = pvn(ji,jj,jk) + ABS( pvn(ji,jj,jk) ) 
     144                  zfm_vj = pvn(ji,jj,jk) - ABS( pvn(ji,jj,jk) ) 
     145                  ! centered scheme 
     146                  zcenut = 0.5 * pun(ji,jj,jk) * ( ptn(ji,jj,jk,jn) + ptn(ji+1,jj  ,jk,jn) ) 
     147                  zcenvt = 0.5 * pvn(ji,jj,jk) * ( ptn(ji,jj,jk,jn) + ptn(ji  ,jj+1,jk,jn) ) 
     148                  ! UBS scheme 
     149                  zwx(ji,jj,jk) =  zcenut - zfp_ui * zltu(ji,jj,jk) - zfm_ui * zltu(ji+1,jj,jk)  
     150                  zwy(ji,jj,jk) =  zcenvt - zfp_vj * zltv(ji,jj,jk) - zfm_vj * zltv(ji,jj+1,jk)  
     151               END DO 
     152            END DO 
     153         END DO                                           ! End of slab          
     154 
     155         zltu(:,:,:) = pta(:,:,:,jn)      ! store pta trends 
     156 
     157         ! Horizontal advective trends 
    228158         DO jk = 1, jpkm1 
     159            !  Tracer flux divergence at t-point added to the general trend 
    229160            DO jj = 2, jpjm1 
    230161               DO ji = fs_2, fs_jpim1   ! vector opt. 
    231                   !-- Compute zonal divergence by splitting hdivn (see divcur.F90) 
    232 #if defined key_zco 
    233                   zbtr = e1e2tr(ji,jj) 
    234                   z_hdivn_x = (  e2u(ji  ,jj) * pun(ji  ,jj,jk)          & 
    235                      &         - e2u(ji-1,jj) * pun(ji-1,jj,jk) ) * zbtr 
    236 #else 
    237                   zbtr = e1e2tr(ji,jj) / fse3t(ji,jj,jk) 
    238                   z_hdivn_x = (  e2u(ji  ,jj) * fse3u(ji  ,jj,jk) * pun(ji  ,jj,jk)          & 
    239                      &         - e2u(ji-1,jj) * fse3u(ji-1,jj,jk) * pun(ji-1,jj,jk) ) * zbtr 
    240 #endif 
    241                   ztrdt(ji,jj,jk) = - ( zwx(ji,jj,jk) - zwx(ji-1,jj,jk) ) * zbtr + tn(ji,jj,jk) * z_hdivn_x 
    242                   ztrds(ji,jj,jk) = - ( zww(ji,jj,jk) - zww(ji-1,jj,jk) ) * zbtr + sn(ji,jj,jk) * z_hdivn_x 
    243                END DO 
    244             END DO 
    245          END DO 
    246          CALL trd_mod(ztrdt, ztrds, jptra_trd_xad, 'TRA', kt)    ! save the trends 
    247          ! 
    248          ! T/S MERIDIONAL advection trends 
     162                  zbtr = 1. / ( e1t(ji,jj) * e2t(ji,jj) * fse3t(ji,jj,jk) ) 
     163                  ! horizontal advective 
     164                  ztra = - zbtr * (  zwx(ji,jj,jk) - zwx(ji-1,jj  ,jk)   & 
     165                     &             + zwy(ji,jj,jk) - zwy(ji  ,jj-1,jk)  ) 
     166                  ! add it to the general tracer trends 
     167                  pta(ji,jj,jk,jn) = pta(ji,jj,jk,jn) + ztra 
     168               END DO 
     169            END DO 
     170            !                                              
     171         END DO                                           !   End of slab 
     172 
     173         ! Horizontal trend used in tra_adv_ztvd subroutine 
     174         zltu(:,:,:) = pta(:,:,:,jn) - zltu(:,:,:) 
     175 
     176         ! 3. Save the horizontal advective trends for diagnostic 
     177         ! ------------------------------------------------------ 
     178         !                                 ! trend diagnostics (contribution of upstream fluxes) 
     179         IF( l_trd ) THEN 
     180             CALL trd_tra( kt, cdtype, jn, jptra_trd_xad, zwx, pun, ptn(:,:,:,jn) ) 
     181             CALL trd_tra( kt, cdtype, jn, jptra_trd_yad, zwy, pvn, ptn(:,:,:,jn) ) 
     182         END IF 
     183         !                                 ! "Poleward" heat and salt transports (contribution of upstream fluxes) 
     184         IF( cdtype == 'TRA' .AND. ln_diaptr .AND. ( MOD( kt, nn_fptr ) == 0 ) ) THEN   
     185            IF( jn == jp_tem )  htr_adv(:) = ptr_vj( zwy(:,:,:) ) 
     186            IF( jn == jp_sal )  str_adv(:) = ptr_vj( zwy(:,:,:) ) 
     187         ENDIF 
     188          
     189         ! TVD scheme for the vertical direction   
     190         ! ---------------------- 
     191         IF( l_trd )   zltv(:,:,:) = pta(:,:,:,jn)          ! store pta if trend diag. 
     192 
     193         !  Bottom value : flux set to zero 
     194         ztw(:,:,jpk) = 0.e0   ;   zti(:,:,jpk) = 0.e0 
     195 
     196         ! Surface value 
     197         IF( lk_vvl ) THEN   ;   ztw(:,:,1) = 0.e0                      ! variable volume : flux set to zero 
     198         ELSE                ;   ztw(:,:,1) = pwn(:,:,1) * ptb(:,:,1,jn)   ! free constant surface  
     199         ENDIF 
     200         !  upstream advection with initial mass fluxes & intermediate update 
     201         ! ------------------------------------------------------------------- 
     202         ! Interior value 
     203         DO jk = 2, jpkm1 
     204            DO jj = 1, jpj 
     205               DO ji = 1, jpi 
     206                   zfp_wk = pwn(ji,jj,jk) + ABS( pwn(ji,jj,jk) ) 
     207                   zfm_wk = pwn(ji,jj,jk) - ABS( pwn(ji,jj,jk) ) 
     208                   ztw(ji,jj,jk) = 0.5 * (  zfp_wk * ptb(ji,jj,jk,jn) + zfm_wk * ptb(ji,jj,jk-1,jn)  ) 
     209               END DO 
     210            END DO 
     211         END DO  
     212         ! update and guess with monotonic sheme 
    249213         DO jk = 1, jpkm1 
     214            z2dtt = p2dt(jk) 
    250215            DO jj = 2, jpjm1 
    251216               DO ji = fs_2, fs_jpim1   ! vector opt. 
    252                   !-- Compute merid. divergence by splitting hdivn (see divcur.F90) 
    253 #if defined key_zco 
    254                   zbtr      = e1e2tr(ji,jj) 
    255                   z_hdivn_y = (  e1v(ji,  jj) * pvn(ji,jj  ,jk)          & 
    256                      &         - e1v(ji,jj-1) * pvn(ji,jj-1,jk) ) * zbtr 
    257 #else 
    258                   zbtr      = e1e2tr(ji,jj) / fse3t(ji,jj,jk) 
    259                   z_hdivn_y = (  e1v(ji,  jj) * fse3v(ji,jj  ,jk) * pvn(ji,jj  ,jk)          & 
    260                      &         - e1v(ji,jj-1) * fse3v(ji,jj-1,jk) * pvn(ji,jj-1,jk) ) * zbtr 
    261 #endif 
    262                   ztrdt(ji,jj,jk) = - ( zwy(ji,jj,jk) - zwy(ji,jj-1,jk) ) * zbtr + tn(ji,jj,jk) * z_hdivn_y           
    263                   ztrds(ji,jj,jk) = - ( zwz(ji,jj,jk) - zwz(ji,jj-1,jk) ) * zbtr + sn(ji,jj,jk) * z_hdivn_y 
    264                END DO 
    265             END DO 
    266          END DO 
    267          CALL trd_mod(ztrdt, ztrds, jptra_trd_yad, 'TRA', kt)     ! save the trends 
     217                  zbtr = 1. / ( e1t(ji,jj) * e2t(ji,jj) * fse3t(ji,jj,jk) ) 
     218                  ztak = - ( ztw(ji,jj,jk) - ztw(ji,jj,jk+1) ) * zbtr 
     219                  pta(ji,jj,jk,jn) =   pta(ji,jj,jk,jn) +  ztak  
     220                  zti(ji,jj,jk)    = ( ptb(ji,jj,jk,jn) + z2dtt * ( ztak + zltu(ji,jj,jk) ) ) * tmask(ji,jj,jk) 
     221               END DO 
     222            END DO 
     223         END DO 
    268224         ! 
    269       ENDIF 
    270  
    271       IF(ln_ctl)   CALL prt_ctl( tab3d_1=ta, clinfo1=' ubs had  - Ta: ', mask1=tmask,   & 
    272          &                       tab3d_2=sa, clinfo2=           ' Sa: ', mask2=tmask, clinfo3='tra' ) 
    273  
    274       ! "zonal" mean advective heat and salt transport  
    275       IF( ln_diaptr .AND. ( MOD( kt, nf_ptr ) == 0 ) ) THEN 
    276          IF( lk_zco ) THEN 
    277             DO jk = 1, jpkm1 
     225         CALL lbc_lnk( zti, 'T', 1. )      ! Lateral boundary conditions on zti, zsi   (unchanged sign) 
     226 
     227         !  antidiffusive flux : high order minus low order 
     228         ztw(:,:,1) = 0.e0       ! Surface value 
     229         DO jk = 2, jpkm1        ! Interior value 
     230            DO jj = 1, jpj 
     231               DO ji = 1, jpi 
     232                  ztw(ji,jj,jk) = 0.5 * pwn(ji,jj,jk) * ( ptn(ji,jj,jk,jn) + ptn(ji,jj,jk-1,jn) ) - ztw(ji,jj,jk) 
     233               END DO 
     234            END DO 
     235         END DO 
     236         ! 
     237         CALL nonosc_z( ptb(:,:,:,jn), ztw, zti, p2dt )      !  monotonicity algorithm 
     238 
     239         !  final trend with corrected fluxes 
     240         DO jk = 1, jpkm1 
     241            DO jj = 2, jpjm1  
     242               DO ji = fs_2, fs_jpim1   ! vector opt.    
     243                  zbtr = 1. / ( e1t(ji,jj) * e2t(ji,jj) * fse3t(ji,jj,jk) ) 
     244                  ! k- vertical advective trends   
     245                  ztra = - zbtr * ( ztw(ji,jj,jk) - ztw(ji,jj,jk+1) ) 
     246                  ! added to the general tracer trends 
     247                  pta(ji,jj,jk,jn) = pta(ji,jj,jk,jn) + ztra 
     248               END DO 
     249            END DO 
     250         END DO 
     251 
     252         !  Save the final vertical advective trends 
     253         IF( l_trd )  THEN                        ! vertical advective trend diagnostics 
     254            DO jk = 1, jpkm1                       ! (compute -w.dk[ptn]= -dk[w.ptn] + ptn.dk[w]) 
    278255               DO jj = 2, jpjm1 
    279256                  DO ji = fs_2, fs_jpim1   ! vector opt. 
    280                      zwy(ji,jj,jk) = zwy(ji,jj,jk) * fse3v(ji,jj,jk) 
    281                      zwz(ji,jj,jk) = zwz(ji,jj,jk) * fse3v(ji,jj,jk) 
     257                     zbtr = 1.e0 / ( e1t(ji,jj) * e2t(ji,jj) * fse3t(ji,jj,jk) ) 
     258                     z_hdivn = (  pwn(ji,jj,jk) - pwn(ji,jj,jk+1)  ) * zbtr 
     259                     zltv(ji,jj,jk) = pta(ji,jj,jk,jn) - zltv(ji,jj,jk) + ptn(ji,jj,jk,jn) * z_hdivn 
    282260                  END DO 
    283261               END DO 
    284262            END DO 
     263            CALL trd_tra( kt, cdtype, jn, jptra_trd_zad, zltv ) 
    285264         ENDIF 
    286          pht_adv(:) = ptr_vj( zwy(:,:,:) ) 
    287          pst_adv(:) = ptr_vj( zwz(:,:,:) ) 
    288       ENDIF 
    289  
    290       ! II. Vertical advection 
    291       ! ---------------------- 
    292       IF( l_trdtra ) THEN          ! Save ta and sa trends 
    293          ztrdt(:,:,:) = ta(:,:,:) 
    294          ztrds(:,:,:) = sa(:,:,:) 
    295       ENDIF 
    296      
    297       ! TVD scheme the vertical direction   
    298       CALL tra_adv_ztvd(kt, pwn, zltu, zlsu) 
    299  
    300       IF( l_trdtra )   THEN         !  Save the final vertical advective trends 
    301          DO jk = 1, jpkm1 
    302             DO jj = 2, jpjm1 
    303                DO ji = fs_2, fs_jpim1   ! vector opt. 
    304 #if defined key_zco 
    305                   zbtr      = e1e2tr(ji,jj) 
    306                   z_hdivn_x = e2u(ji,jj)*pun(ji,jj,jk) - e2u(ji-1,jj)*pun(ji-1,jj,jk) 
    307                   z_hdivn_y = e1v(ji,jj)*pvn(ji,jj,jk) - e1v(ji,jj-1)*pvn(ji,jj-1,jk) 
    308 #else 
    309                   zbtr      = e1e2tr(ji,jj) / fse3t(ji,jj,jk) 
    310                   z_hdivn_x = e2u(ji,jj)*fse3u(ji,jj,jk)*pun(ji,jj,jk) - e2u(ji-1,jj)*fse3u(ji-1,jj,jk)*pun(ji-1,jj,jk) 
    311                   z_hdivn_y = e1v(ji,jj)*fse3v(ji,jj,jk)*pvn(ji,jj,jk) - e1v(ji,jj-1)*fse3v(ji,jj-1,jk)*pvn(ji,jj-1,jk) 
    312 #endif 
    313                   z_hdivn   = (z_hdivn_x + z_hdivn_y) * zbtr 
    314                   zbtr      = e1e2tr(ji,jj) / fse3t(ji,jj,jk) 
    315                   ztrdt(ji,jj,jk) = ta(ji,jj,jk) - ztrdt(ji,jj,jk) - tn(ji,jj,jk) * z_hdivn 
    316                   ztrds(ji,jj,jk) = sa(ji,jj,jk) - ztrds(ji,jj,jk) - sn(ji,jj,jk) * z_hdivn 
    317                END DO 
    318             END DO 
    319          END DO 
    320          CALL trd_mod(ztrdt, ztrds, jptra_trd_zad, 'TRA', kt)   ! <<< ADD TO PREVIOUSLY COMPUTED 
    321265         ! 
    322       ENDIF 
    323  
    324       IF(ln_ctl)   CALL prt_ctl( tab3d_1=ta, clinfo1=' ubs zad  - Ta: ', mask1=tmask,   & 
    325          &                       tab3d_2=sa, clinfo2=           ' Sa: ', mask2=tmask, clinfo3='tra') 
     266      ENDDO 
    326267      ! 
    327268   END SUBROUTINE tra_adv_ubs 
    328269 
    329270 
    330    SUBROUTINE tra_adv_ztvd( kt, pwn, zttrd, zstrd ) 
    331       !!---------------------------------------------------------------------- 
    332       !!                  ***  ROUTINE tra_adv_ztvd  *** 
    333       !!  
    334       !! **  Purpose :   Compute the now trend due to total advection of  
    335       !!       tracers and add it to the general trend of tracer equations 
    336       !! 
    337       !! **  Method  :   TVD scheme, i.e. 2nd order centered scheme with 
    338       !!       corrected flux (monotonic correction) 
    339       !!       note: - this advection scheme needs a leap-frog time scheme 
    340       !! 
    341       !! ** Action : - update (ta,sa) with the now advective tracer trends 
    342       !!             - save the trends in (ztrdt,ztrds) ('key_trdtra') 
    343       !!---------------------------------------------------------------------- 
    344       INTEGER , INTENT(in)                         ::   kt             ! ocean time-step 
    345       REAL(wp), INTENT(in), DIMENSION(jpi,jpj,jpk) ::   pwn            ! verical effective velocity 
    346       REAL(wp), INTENT(in), DIMENSION(jpi,jpj,jpk) ::   zttrd, zstrd   ! lateral advective trends on T & S  
    347       !! 
    348       INTEGER  ::   ji, jj, jk              ! dummy loop indices 
    349       REAL(wp) ::   z2dtt, zbtr, zew, z2    ! temporary scalar   
    350       REAL(wp) ::   ztak, zfp_wk            !    "         " 
    351       REAL(wp) ::   zsak, zfm_wk            !    "         " 
    352       REAL(wp), DIMENSION (jpi,jpj,jpk) ::   zti, ztw   ! temporary 3D workspace 
    353       REAL(wp), DIMENSION (jpi,jpj,jpk) ::   zsi, zsw   !    "              " 
    354       !!---------------------------------------------------------------------- 
    355  
    356       IF( kt == nit000 .AND. lwp ) THEN 
    357          WRITE(numout,*) 
    358          WRITE(numout,*) 'tra_adv_ztvd : vertical TVD advection scheme' 
    359          WRITE(numout,*) '~~~~~~~~~~~~' 
    360       ENDIF 
    361  
    362       IF( neuler == 0 .AND. kt == nit000 ) THEN   ;    z2 = 1. 
    363       ELSE                                        ;    z2 = 2. 
    364       ENDIF 
    365  
    366       !  Bottom value : flux set to zero 
    367       ! -------------- 
    368       ztw(:,:,jpk) = 0.e0   ;   zsw(:,:,jpk) = 0.e0 
    369       zti  (:,:,:) = 0.e0   ;   zsi  (:,:,:) = 0.e0 
    370  
    371  
    372       !  upstream advection with initial mass fluxes & intermediate update 
    373       ! ------------------------------------------------------------------- 
    374       ! Surface value 
    375       IF( lk_vvl ) THEN 
    376          ! variable volume : flux set to zero 
    377          ztw(:,:,1) = 0.e0 
    378          zsw(:,:,1) = 0.e0 
    379       ELSE 
    380          ! free surface-constant volume 
    381          DO jj = 1, jpj 
    382             DO ji = 1, jpi 
    383                zew = e1t(ji,jj) * e2t(ji,jj) * pwn(ji,jj,1) 
    384                ztw(ji,jj,1) = zew * tb(ji,jj,1) 
    385                zsw(ji,jj,1) = zew * sb(ji,jj,1) 
    386             END DO 
    387          END DO 
    388       ENDIF 
    389  
    390       ! Interior value 
    391       DO jk = 2, jpkm1 
    392          DO jj = 1, jpj 
    393             DO ji = 1, jpi 
    394                zew = 0.5 * e1t(ji,jj) * e2t(ji,jj) * pwn(ji,jj,jk) 
    395                zfp_wk = zew + ABS( zew ) 
    396                zfm_wk = zew - ABS( zew ) 
    397                ztw(ji,jj,jk) = zfp_wk * tb(ji,jj,jk) + zfm_wk * tb(ji,jj,jk-1) 
    398                zsw(ji,jj,jk) = zfp_wk * sb(ji,jj,jk) + zfm_wk * sb(ji,jj,jk-1) 
    399             END DO 
    400          END DO 
    401       END DO 
    402  
    403       ! update and guess with monotonic sheme 
    404       DO jk = 1, jpkm1 
    405          z2dtt = z2 * rdttra(jk) 
    406          DO jj = 2, jpjm1 
    407             DO ji = fs_2, fs_jpim1   ! vector opt. 
    408                zbtr = 1./ ( e1t(ji,jj) * e2t(ji,jj) * fse3t(ji,jj,jk) ) 
    409                ztak = - ( ztw(ji,jj,jk) - ztw(ji,jj,jk+1) ) * zbtr 
    410                zsak = - ( zsw(ji,jj,jk) - zsw(ji,jj,jk+1) ) * zbtr 
    411                ta(ji,jj,jk) =  ta(ji,jj,jk) + ztak 
    412                sa(ji,jj,jk) =  sa(ji,jj,jk) + zsak  
    413                zti (ji,jj,jk) = ( tb(ji,jj,jk) + z2dtt * ( ztak + zttrd(ji,jj,jk) ) ) * tmask(ji,jj,jk) 
    414                zsi (ji,jj,jk) = ( sb(ji,jj,jk) + z2dtt * ( zsak + zstrd(ji,jj,jk) ) ) * tmask(ji,jj,jk) 
    415             END DO 
    416          END DO 
    417       END DO 
    418  
    419       ! Lateral boundary conditions on zti, zsi   (unchanged sign) 
    420       CALL lbc_lnk( zti, 'T', 1. ) 
    421       CALL lbc_lnk( zsi, 'T', 1. ) 
    422  
    423  
    424       !  antidiffusive flux : high order minus low order 
    425       ! -------------------------------------------------       
    426       ! Surface value 
    427       ztw(:,:,1) = 0.e0   ;   zsw(:,:,1) = 0.e0 
    428  
    429       ! Interior value 
    430       DO jk = 2, jpkm1 
    431          DO jj = 1, jpj 
    432             DO ji = 1, jpi 
    433                zew = 0.5 * e1t(ji,jj) * e2t(ji,jj) * pwn(ji,jj,jk) 
    434                ztw(ji,jj,jk) = zew * ( tn(ji,jj,jk) + tn(ji,jj,jk-1) ) - ztw(ji,jj,jk) 
    435                zsw(ji,jj,jk) = zew * ( sn(ji,jj,jk) + sn(ji,jj,jk-1) ) - zsw(ji,jj,jk) 
    436             END DO 
    437          END DO 
    438       END DO 
    439  
    440       !  monotonicity algorithm 
    441       ! ------------------------ 
    442       CALL nonosc_z( tb, ztw, zti, z2 ) 
    443       CALL nonosc_z( sb, zsw, zsi, z2 ) 
    444  
    445  
    446       !  final trend with corrected fluxes 
    447       ! ----------------------------------- 
    448       DO jk = 1, jpkm1 
    449          DO jj = 2, jpjm1 
    450             DO ji = fs_2, fs_jpim1   ! vector opt.   
    451                zbtr = 1. / ( e1t(ji,jj) * e2t(ji,jj) * fse3t(ji,jj,jk) ) 
    452                ! k- vertical advective trends 
    453                ztak = - ( ztw(ji,jj,jk) - ztw(ji,jj,jk+1) ) * zbtr 
    454                zsak = - ( zsw(ji,jj,jk) - zsw(ji,jj,jk+1) ) * zbtr 
    455                ! add them to the general tracer trends 
    456                ta(ji,jj,jk) = ta(ji,jj,jk) + ztak 
    457                sa(ji,jj,jk) = sa(ji,jj,jk) + zsak 
    458             END DO 
    459          END DO 
    460       END DO 
    461       ! 
    462    END SUBROUTINE tra_adv_ztvd 
    463  
    464  
    465    SUBROUTINE nonosc_z( pbef, pcc, paft, prdt ) 
     271   SUBROUTINE nonosc_z( pbef, pcc, paft, p2dt ) 
    466272      !!--------------------------------------------------------------------- 
    467273      !!                    ***  ROUTINE nonosc_z  *** 
     
    476282      !!       in-space based differencing for fluid 
    477283      !!---------------------------------------------------------------------- 
    478       REAL(wp), INTENT(in   )                          ::   prdt   ! ??? 
    479       REAL(wp), INTENT(inout), DIMENSION (jpi,jpj,jpk) ::   pbef   ! before field 
     284      REAL(wp), INTENT(in   ), DIMENSION(jpk)          ::   p2dt   ! vertical profile of tracer time-step 
     285      REAL(wp),               DIMENSION (jpi,jpj,jpk) ::   pbef   ! before field 
    480286      REAL(wp), INTENT(inout), DIMENSION (jpi,jpj,jpk) ::   paft   ! after field 
    481287      REAL(wp), INTENT(inout), DIMENSION (jpi,jpj,jpk) ::   pcc    ! monotonic flux in the k direction 
     
    525331      pbef(:,:,:) = pbef(:,:,:) * tmask(:,:,:) 
    526332      paft(:,:,:) = paft(:,:,:) * tmask(:,:,:) 
    527   
     333 
    528334 
    529335      ! 2. Positive and negative part of fluxes and beta terms 
     
    531337 
    532338      DO jk = 1, jpkm1 
    533          z2dtt = prdt * rdttra(jk) 
     339         z2dtt = p2dt(jk) 
    534340         DO jj = 2, jpjm1 
    535341            DO ji = fs_2, fs_jpim1   ! vector opt. 
     
    544350         END DO 
    545351      END DO 
    546  
    547352      ! monotonic flux in the k direction, i.e. pcc 
    548353      ! ------------------------------------------- 
     
    550355         DO jj = 2, jpjm1 
    551356            DO ji = fs_2, fs_jpim1   ! vector opt. 
    552  
    553357               za = MIN( 1., zbetdo(ji,jj,jk), zbetup(ji,jj,jk-1) ) 
    554358               zb = MIN( 1., zbetup(ji,jj,jk), zbetdo(ji,jj,jk-1) ) 
Note: See TracChangeset for help on using the changeset viewer.