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_cen2.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_cen2.F90

    • Property svn:eol-style deleted
    r1559 r2528  
    22   !!====================================================================== 
    33   !!                     ***  MODULE  traadv_cen2  *** 
    4    !! Ocean active tracers:  horizontal & vertical advective trend 
     4   !! Ocean tracers:  horizontal & vertical advective trend 
    55   !!====================================================================== 
    66   !! History :  8.2  ! 2001-08  (G. Madec, E. Durand)  trahad+trazad=traadv  
     
    1111   !!             -   ! 2006-07  (G. madec)  add ups_orca_set routine 
    1212   !!            3.2  ! 2009-07  (G. Madec) add avmb, avtb in restart for cen2 advection 
    13    !!---------------------------------------------------------------------- 
    14  
    15    !!---------------------------------------------------------------------- 
    16    !!   tra_adv_cen2 : update the tracer trend with the horizontal and 
    17    !!                  vertical advection trends using a seconder order 
    18    !!   ups_orca_set : allow mixed upstream/centered scheme in specific 
    19    !!                  area (set for orca 2 and 4 only) 
    20    !!---------------------------------------------------------------------- 
    21    USE oce             ! ocean dynamics and active tracers 
     13   !!            3.3  ! 2010-05  (C. Ethe, G. Madec)  merge TRC-TRA + switch from velocity to transport 
     14   !!---------------------------------------------------------------------- 
     15 
     16   !!---------------------------------------------------------------------- 
     17   !!   tra_adv_cen2 : update the tracer trend with the advection trends using a 2nd order centered scheme 
     18   !!   ups_orca_set : allow mixed upstream/centered scheme in specific area (set for orca 2 and 4 only) 
     19   !!---------------------------------------------------------------------- 
     20   USE oce, ONLY: tsn  ! now ocean temperature and salinity 
    2221   USE dom_oce         ! ocean space and time domain 
    23    USE sbc_oce         ! surface boundary condition: ocean 
    24    USE dynspg_oce      ! choice/control of key cpp for surface pressure gradient 
    25    USE trdmod_oce      ! ocean variables trends 
    2622   USE eosbn2          ! equation of state 
    27    USE trdmod          ! ocean active tracers trends  
     23   USE trdmod_oce      ! tracers trends 
     24   USE trdtra          ! tracers trends 
    2825   USE closea          ! closed sea 
    29    USE trabbl          ! advective term in the BBL 
    30    USE sbcmod          ! surface Boundary Condition 
    3126   USE sbcrnf          ! river runoffs 
    3227   USE in_out_manager  ! I/O manager 
    3328   USE iom             ! IOM library 
    34    USE lib_mpp 
    35    USE lbclnk          ! ocean lateral boundary condition (or mpp link) 
    3629   USE diaptr          ! poleward transport diagnostics 
    37    USE prtctl          ! Print control 
    3830   USE zdf_oce         ! ocean vertical physics 
    3931   USE restart         ! ocean restart 
     32   USE trc_oce         ! share passive tracers/Ocean variables 
    4033 
    4134   IMPLICIT NONE 
     
    4538   PUBLIC   ups_orca_set    ! routine used by traadv_cen2_jki.F90 
    4639 
    47    REAL(wp), PUBLIC, DIMENSION(jpi,jpj) ::   upsmsk    !: mixed upstream/centered scheme near some straits  
     40   LOGICAL  :: l_trd       ! flag to compute trends 
     41 
     42   REAL(wp), PUBLIC, DIMENSION(jpi,jpj) :: upsmsk    !: mixed upstream/centered scheme near some straits  
    4843   !                                                   !  and in closed seas (orca 2 and 4 configurations) 
    49  
    50    REAL(wp), DIMENSION(jpi,jpj) ::   btr2   ! inverse of T-point surface [1/(e1t*e2t)] 
    51  
    5244   !! * Substitutions 
    5345#  include "domzgr_substitute.h90" 
    5446#  include "vectopt_loop_substitute.h90" 
    5547   !!---------------------------------------------------------------------- 
    56    !! NEMO/OPA 3.2 , LOCEAN-IPSL (2009)  
     48   !! NEMO/OPA 3.3 , NEMO Consortium (2010) 
    5749   !! $Id$ 
    58    !! Software governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt) 
    59    !!---------------------------------------------------------------------- 
    60  
     50   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt) 
     51   !!---------------------------------------------------------------------- 
    6152CONTAINS 
    6253 
    63    SUBROUTINE tra_adv_cen2( kt, pun, pvn, pwn ) 
     54   SUBROUTINE tra_adv_cen2( kt, cdtype, pun, pvn, pwn,        & 
     55      &                                 ptb, ptn, pta, kjpt   )  
    6456      !!---------------------------------------------------------------------- 
    6557      !!                  ***  ROUTINE tra_adv_cen2  *** 
     
    7769      !!         Part I : horizontal advection 
    7870      !!       * centered flux: 
    79       !!               zcenu = e2u*e3u  un  mi(tn) 
    80       !!               zcenv = e1v*e3v  vn  mj(tn) 
     71      !!               zcenu = e2u*e3u  un  mi(ptn) 
     72      !!               zcenv = e1v*e3v  vn  mj(ptn) 
    8173      !!       * upstream flux: 
    82       !!               zupsu = e2u*e3u  un  (tb(i) or tb(i-1) ) [un>0 or <0] 
    83       !!               zupsv = e1v*e3v  vn  (tb(j) or tb(j-1) ) [vn>0 or <0] 
     74      !!               zupsu = e2u*e3u  un  (ptb(i) or ptb(i-1) ) [un>0 or <0] 
     75      !!               zupsv = e1v*e3v  vn  (ptb(j) or ptb(j-1) ) [vn>0 or <0] 
    8476      !!       * mixed upstream / centered horizontal advection scheme 
    8577      !!               zcofi = max(zind(i+1), zind(i)) 
     
    8880      !!               zwy = zcofj * zupsv + (1-zcofj) * zcenv 
    8981      !!       * horizontal advective trend (divergence of the fluxes) 
    90       !!               zta = 1/(e1t*e2t*e3t) { di-1[zwx] + dj-1[zwy] } 
     82      !!               ztra = 1/(e1t*e2t*e3t) { di-1[zwx] + dj-1[zwy] } 
    9183      !!       * Add this trend now to the general trend of tracer (ta,sa): 
    92       !!              (ta,sa) = (ta,sa) + ( zta , zsa ) 
     84      !!               pta = pta + ztra 
    9385      !!       * trend diagnostic ('key_trdtra' defined): the trend is 
    9486      !!      saved for diagnostics. The trends saved is expressed as 
    9587      !!      Uh.gradh(T), i.e. 
    96       !!                     save trend = zta + tn divn 
    97       !!         In addition, the advective trend in the two horizontal direc- 
    98       !!      tion is also re-computed as Uh gradh(T). Indeed hadt+tn divn is 
    99       !!      equal to (in s-coordinates, and similarly in z-coord.): 
    100       !!         zta+tn*divn=1/(e1t*e2t*e3t) { mi-1( e2u*e3u  un  di[tn] ) 
    101       !!                                      +mj-1( e1v*e3v  vn  mj[tn] )  } 
    102       !!         NB:in z-coordinate - full step (ln_zco=T) e3u=e3v=e3t, so 
    103       !!      they vanish from the expression of the flux and divergence. 
     88      !!                     save trend = ztra + ptn divn 
    10489      !! 
    10590      !!         Part II : vertical advection 
    10691      !!      For temperature (idem for salinity) the advective trend is com- 
    10792      !!      puted as follows : 
    108       !!            zta = 1/e3t dk+1[ zwz ] 
     93      !!            ztra = 1/e3t dk+1[ zwz ] 
    10994      !!      where the vertical advective flux, zwz, is given by : 
    11095      !!            zwz = zcofk * zupst + (1-zcofk) * zcent 
    11196      !!      with 
    112       !!        zupsv = upstream flux = wn * (tb(k) or tb(k-1) ) [wn>0 or <0] 
     97      !!        zupsv = upstream flux = wn * (ptb(k) or ptb(k-1) ) [wn>0 or <0] 
    11398      !!        zcenu = centered flux = wn * mk(tn) 
    11499      !!         The surface boundary condition is : 
    115100      !!      variable volume (lk_vvl = T) : zero advective flux 
    116       !!      lin. free-surf  (lk_vvl = F) : wn(:,:,1) * tn(:,:,1) 
     101      !!      lin. free-surf  (lk_vvl = F) : wn(:,:,1) * ptn(:,:,1) 
    117102      !!         Add this trend now to the general trend of tracer (ta,sa): 
    118       !!            (ta,sa) = (ta,sa) + ( zta , zsa ) 
     103      !!             pta = pta + ztra 
    119104      !!         Trend diagnostic ('key_trdtra' defined): the trend is 
    120105      !!      saved for diagnostics. The trends saved is expressed as : 
    121       !!             save trend =  w.gradz(T) = zta - tn divn. 
    122       !! 
    123       !! ** Action :  - update (ta,sa) with the now advective tracer trends 
    124       !!              - save trends in (ztrdt,ztrds) ('key_trdtra') 
    125       !!---------------------------------------------------------------------- 
    126       USE oce, ONLY :   zwx => ua   ! use ua as workspace 
    127       USE oce, ONLY :   zwy => va   ! use va as workspace 
    128       !! 
    129       INTEGER , INTENT(in)                         ::   kt    ! ocean time-step index 
    130       REAL(wp), INTENT(in), DIMENSION(jpi,jpj,jpk) ::   pun   ! ocean velocity u-component 
    131       REAL(wp), INTENT(in), DIMENSION(jpi,jpj,jpk) ::   pvn   ! ocean velocity v-component 
    132       REAL(wp), INTENT(in), DIMENSION(jpi,jpj,jpk) ::   pwn   ! ocean velocity w-component 
    133       !! 
    134       INTEGER  ::   ji, jj, jk                       ! dummy loop indices 
    135       REAL(wp) ::   zbtr, zhw, ze3tr                 ! temporary scalars 
    136       REAL(wp) ::   zfp_ui, zfp_vj, zfp_w , zfui     !    -         - 
    137       REAL(wp) ::   zfm_ui, zfm_vj, zfm_w , zfvj     !    -         - 
     106      !!             save trend =  w.gradz(T) = ztra - ptn divn. 
     107      !! 
     108      !! ** Action :  - update pta  with the now advective tracer trends 
     109      !!              - save trends if needed 
     110      !!---------------------------------------------------------------------- 
     111      USE oce         , zwx => ua   ! use ua as workspace 
     112      USE oce         , zwy => va   ! use va as workspace 
     113      !! 
     114      INTEGER                              , INTENT(in   ) ::   kt              ! ocean time-step index 
     115      CHARACTER(len=3)                     , INTENT(in   ) ::   cdtype          ! =TRA or TRC (tracer indicator) 
     116      INTEGER                              , INTENT(in   ) ::   kjpt            ! number of tracers 
     117      REAL(wp), DIMENSION(jpi,jpj,jpk     ), INTENT(in   ) ::   pun, pvn, pwn   ! 3 ocean velocity components 
     118      REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(in   ) ::   ptb, ptn        ! before and now tracer fields 
     119      REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) ::   pta             ! tracer trend  
     120      !! 
     121      INTEGER  ::   ji, jj, jk, jn                   ! dummy loop indices 
     122      REAL(wp) ::   zbtr, ztra                       ! temporary scalars 
     123      REAL(wp) ::   zfp_ui, zfp_vj, zfp_w            !    -         - 
     124      REAL(wp) ::   zfm_ui, zfm_vj, zfm_w            !    -         - 
    138125      REAL(wp) ::   zcofi , zcofj , zcofk            !    -         - 
    139       REAL(wp) ::   zupsut, zupsus, zcenut, zcenus   !    -         - 
    140       REAL(wp) ::   zupsvt, zupsvs, zcenvt, zcenvs   !    -         - 
    141       REAL(wp) ::   zupst , zupss , zcent , zcens    !    -         - 
    142       REAL(wp) ::   z_hdivn_x, z_hdivn_y, z_hdivn    !    -         - 
     126      REAL(wp) ::   zupsut, zcenut                   !    -         - 
     127      REAL(wp) ::   zupsvt, zcenvt                   !    -         - 
     128      REAL(wp) ::   zupst , zcent                    !    -         - 
    143129      REAL(wp) ::   zice                             !    -         - 
    144130      REAL(wp), DIMENSION(jpi,jpj)     ::   ztfreez            ! 2D workspace 
    145       REAL(wp), DIMENSION(jpi,jpj,jpk) ::   zwz, ztrdt, zind   ! 3D workspace 
    146       REAL(wp), DIMENSION(jpi,jpj,jpk) ::   zww, ztrds         !  "      " 
    147       !!---------------------------------------------------------------------- 
    148  
    149       IF( kt == nit000 ) THEN 
     131      REAL(wp), DIMENSION(jpi,jpj,jpk) ::   zwz, zind   ! 3D workspace  
     132      !!---------------------------------------------------------------------- 
     133 
     134 
     135      IF( kt == nit000 )  THEN 
    150136         IF(lwp) WRITE(numout,*) 
    151          IF(lwp) WRITE(numout,*) 'tra_adv_cen2 : 2nd order centered advection scheme' 
    152          IF(lwp) WRITE(numout,*) '~~~~~~~~~~~~   Vector optimization case' 
     137         IF(lwp) WRITE(numout,*) 'tra_adv_cen2 : 2nd order centered advection scheme on ', cdtype 
     138         IF(lwp) WRITE(numout,*) '~~~~~~~~~~~~ ' 
    153139         IF(lwp) WRITE(numout,*) 
    154140         ! 
     
    157143         IF( cp_cfg == "orca" )   CALL ups_orca_set      ! set mixed Upstream/centered scheme near some straits 
    158144         !                                               ! and in closed seas (orca2 and orca4 only) 
    159          !    
    160          btr2(:,:) = 1. / ( e1t(:,:) * e2t(:,:) )        ! inverse of T-point surface 
    161          ! 
    162145         IF( jp_cfg == 2 .AND. .NOT. ln_rstart ) THEN    ! Increase the background in the surface layers 
    163146            avmb(1) = 10.  * avmb(1)      ;      avtb(1) = 10.  * avtb(1) 
     
    166149            avmb(4) =  2.5 * avmb(4)      ;      avtb(4) =  2.5 * avtb(4) 
    167150         ENDIF 
     151         ! 
     152         l_trd = .FALSE. 
     153         IF( ( cdtype == 'TRA' .AND. l_trdtra ) .OR. ( cdtype == 'TRC' .AND. l_trdtrc ) ) l_trd = .TRUE. 
    168154      ENDIF 
    169  
     155      ! 
    170156      ! Upstream / centered scheme indicator 
    171157      ! ------------------------------------ 
    172158!!gm  not strickly exact : the freezing point should be computed at each ocean levels... 
    173159!!gm  not a big deal since cen2 is no more used in global ice-ocean simulations 
    174       ztfreez(:,:) = tfreez( sn(:,:,1) ) 
     160      ztfreez(:,:) = tfreez( tsn(:,:,1,jp_sal) ) 
    175161      DO jk = 1, jpk 
    176162         DO jj = 1, jpj 
    177163            DO ji = 1, jpi 
    178164               !                                        ! below ice covered area (if tn < "freezing"+0.1 ) 
    179                IF( tn(ji,jj,jk) <= ztfreez(ji,jj) + 0.1 ) THEN   ;   zice = 1.e0 
    180                ELSE                                              ;   zice = 0.e0 
     165               IF( tsn(ji,jj,jk,jp_tem) <= ztfreez(ji,jj) + 0.1 ) THEN   ;   zice = 1.e0 
     166               ELSE                                                      ;   zice = 0.e0 
    181167               ENDIF 
    182168               zind(ji,jj,jk) = MAX (   & 
     
    189175      END DO 
    190176 
    191       ! I. Horizontal advection 
    192       !    ==================== 
    193       ! 
    194       DO jk = 1, jpkm1 
    195          !                        ! Second order centered tracer flux at u- and v-points 
    196          DO jj = 1, jpjm1 
    197             DO ji = 1, fs_jpim1   ! vector opt. 
    198                ! upstream indicator 
    199                zcofi = MAX( zind(ji+1,jj,jk), zind(ji,jj,jk) ) 
    200                zcofj = MAX( zind(ji,jj+1,jk), zind(ji,jj,jk) ) 
    201                ! volume fluxes * 1/2 
    202                zfui = 0.5 * e2u(ji,jj) * fse3u(ji,jj,jk) * pun(ji,jj,jk) 
    203                zfvj = 0.5 * e1v(ji,jj) * fse3v(ji,jj,jk) * pvn(ji,jj,jk) 
     177      DO jn = 1, kjpt 
     178         ! 
     179         ! I. Horizontal advection 
     180         !    ==================== 
     181         ! 
     182         DO jk = 1, jpkm1 
     183            !                        ! Second order centered tracer flux at u- and v-points 
     184            DO jj = 1, jpjm1 
    204185               ! 
    205                ! upstream scheme 
    206                zfp_ui = zfui + ABS( zfui ) 
    207                zfp_vj = zfvj + ABS( zfvj ) 
    208                zfm_ui = zfui - ABS( zfui ) 
    209                zfm_vj = zfvj - ABS( zfvj ) 
    210                zupsut = zfp_ui * tb(ji,jj,jk) + zfm_ui * tb(ji+1,jj  ,jk) 
    211                zupsvt = zfp_vj * tb(ji,jj,jk) + zfm_vj * tb(ji  ,jj+1,jk) 
    212                zupsus = zfp_ui * sb(ji,jj,jk) + zfm_ui * sb(ji+1,jj  ,jk) 
    213                zupsvs = zfp_vj * sb(ji,jj,jk) + zfm_vj * sb(ji  ,jj+1,jk) 
    214                ! centered scheme 
    215                zcenut = zfui * ( tn(ji,jj,jk) + tn(ji+1,jj  ,jk) ) 
    216                zcenvt = zfvj * ( tn(ji,jj,jk) + tn(ji  ,jj+1,jk) ) 
    217                zcenus = zfui * ( sn(ji,jj,jk) + sn(ji+1,jj  ,jk) ) 
    218                zcenvs = zfvj * ( sn(ji,jj,jk) + sn(ji  ,jj+1,jk) ) 
    219                ! mixed centered / upstream scheme 
    220                zwx(ji,jj,jk) = zcofi * zupsut + (1.-zcofi) * zcenut 
    221                zwy(ji,jj,jk) = zcofj * zupsvt + (1.-zcofj) * zcenvt 
    222                zww(ji,jj,jk) = zcofi * zupsus + (1.-zcofi) * zcenus 
    223                zwz(ji,jj,jk) = zcofj * zupsvs + (1.-zcofj) * zcenvs 
     186               DO ji = 1, fs_jpim1   ! vector opt. 
     187                  ! upstream indicator 
     188                  zcofi = MAX( zind(ji+1,jj,jk), zind(ji,jj,jk) ) 
     189                  zcofj = MAX( zind(ji,jj+1,jk), zind(ji,jj,jk) ) 
     190                  ! 
     191                  ! upstream scheme 
     192                  zfp_ui = pun(ji,jj,jk) + ABS( pun(ji,jj,jk) ) 
     193                  zfm_ui = pun(ji,jj,jk) - ABS( pun(ji,jj,jk) ) 
     194                  zfp_vj = pvn(ji,jj,jk) + ABS( pvn(ji,jj,jk) ) 
     195                  zfm_vj = pvn(ji,jj,jk) - ABS( pvn(ji,jj,jk) ) 
     196                  zupsut = zfp_ui * ptb(ji,jj,jk,jn) + zfm_ui * ptb(ji+1,jj  ,jk,jn) 
     197                  zupsvt = zfp_vj * ptb(ji,jj,jk,jn) + zfm_vj * ptb(ji  ,jj+1,jk,jn) 
     198                  ! centered scheme 
     199                  zcenut = pun(ji,jj,jk) * ( ptn(ji,jj,jk,jn) + ptn(ji+1,jj  ,jk,jn) ) 
     200                  zcenvt = pvn(ji,jj,jk) * ( ptn(ji,jj,jk,jn) + ptn(ji  ,jj+1,jk,jn) ) 
     201                  ! mixed centered / upstream scheme 
     202                  zwx(ji,jj,jk) = 0.5 * ( zcofi * zupsut + (1.-zcofi) * zcenut ) 
     203                  zwy(ji,jj,jk) = 0.5 * ( zcofj * zupsvt + (1.-zcofj) * zcenvt ) 
     204               END DO 
    224205            END DO 
    225206         END DO 
    226          !                        ! Tracer flux divergence at t-point added to the general trend 
    227          DO jj = 2, jpjm1 
    228             DO ji = fs_2, fs_jpim1   ! vector opt. 
    229                zbtr = btr2(ji,jj) / fse3t(ji,jj,jk) 
    230                ! 
    231                ta(ji,jj,jk) = ta(ji,jj,jk) - zbtr * (  zwx(ji,jj,jk) - zwx(ji-1,jj  ,jk)  & 
    232                   &                                  + zwy(ji,jj,jk) - zwy(ji  ,jj-1,jk)  ) 
    233                sa(ji,jj,jk) = sa(ji,jj,jk) - zbtr * (  zww(ji,jj,jk) - zww(ji-1,jj  ,jk)  & 
    234                   &                                  + zwz(ji,jj,jk) - zwz(ji  ,jj-1,jk)  ) 
     207 
     208         ! II. Vertical advection 
     209         !     ================== 
     210         ! 
     211         !                                                ! Vertical advective fluxes 
     212         zwz(:,:,jpk) = 0.e0                                   ! Bottom  value : flux set to zero 
     213         !                                                     ! Surface value :  
     214         IF( lk_vvl ) THEN   ;   zwz(:,:, 1 ) = 0.e0                         ! volume variable 
     215         ELSE                ;   zwz(:,:, 1 ) = pwn(:,:,1) * ptn(:,:,1,jn)   ! linear free surface  
     216         ENDIF 
     217         ! 
     218         DO jk = 2, jpk              ! Second order centered tracer flux at w-point 
     219            DO jj = 2, jpjm1 
     220               DO ji = fs_2, fs_jpim1   ! vector opt. 
     221                  ! upstream indicator 
     222                  zcofk = MAX( zind(ji,jj,jk-1), zind(ji,jj,jk) )  
     223                  ! mixed centered / upstream scheme 
     224                  zfp_w = pwn(ji,jj,jk) + ABS( pwn(ji,jj,jk) ) 
     225                  zfm_w = pwn(ji,jj,jk) - ABS( pwn(ji,jj,jk) ) 
     226                  zupst = zfp_w * ptb(ji,jj,jk,jn) + zfm_w * ptb(ji,jj,jk-1,jn) 
     227                  ! centered scheme 
     228                  zcent = pwn(ji,jj,jk) * ( ptn(ji,jj,jk,jn) + ptn(ji,jj,jk-1,jn) ) 
     229                  ! mixed centered / upstream scheme 
     230                  zwz(ji,jj,jk) = 0.5 * ( zcofk * zupst + (1.-zcofk) * zcent ) 
     231               END DO 
    235232            END DO 
    236233         END DO 
    237       END DO 
    238  
    239  
    240       IF( l_trdtra ) THEN      ! Save the i- and j-advective trends for diagnostic (U.gradz(T) trends) 
    241          ! 
     234 
     235         ! II. Divergence of advective fluxes 
     236         ! ---------------------------------- 
    242237         DO jk = 1, jpkm1 
    243238            DO jj = 2, jpjm1 
    244239               DO ji = fs_2, fs_jpim1   ! vector opt. 
    245                   !-- Compute zonal divergence by splitting hdivn (see divcur.F90) 
    246                   !   N.B. This computation is not valid with OBC, BDY, cla, eiv, advective bbl  
    247                   zbtr      = btr2(ji,jj) / fse3t(ji,jj,jk) 
    248                   z_hdivn_x = (  e2u(ji  ,jj) * fse3u(ji  ,jj,jk) * pun(ji  ,jj,jk)          & 
    249                      &         - e2u(ji-1,jj) * fse3u(ji-1,jj,jk) * pun(ji-1,jj,jk) ) * zbtr 
    250                   ! 
    251                   ztrdt(ji,jj,jk) = - zbtr * ( zwx(ji,jj,jk) - zwx(ji-1,jj,jk) ) + tn(ji,jj,jk) * z_hdivn_x 
    252                   ztrds(ji,jj,jk) = - zbtr * ( zww(ji,jj,jk) - zww(ji-1,jj,jk) ) + sn(ji,jj,jk) * z_hdivn_x 
     240                  zbtr = 1. / ( e1t(ji,jj) * e2t(ji,jj) *  fse3t(ji,jj,jk) ) 
     241                  ! advective trends 
     242                  ztra = - zbtr * (  zwx(ji,jj,jk) - zwx(ji-1,jj  ,jk  )   & 
     243                  &                + zwy(ji,jj,jk) - zwy(ji  ,jj-1,jk  )   & 
     244                  &                + zwz(ji,jj,jk) - zwz(ji  ,jj  ,jk+1)  ) 
     245                  ! advective trends added to the general tracer trends 
     246                  pta(ji,jj,jk,jn) = pta(ji,jj,jk,jn) + ztra 
    253247               END DO 
    254248            END DO 
    255249         END DO 
    256          CALL trd_mod(ztrdt, ztrds, jptra_trd_xad, 'TRA', kt) 
    257          ! 
    258          DO jk = 1, jpkm1           ! T/S MERIDIONAL advection trends 
    259             DO jj = 2, jpjm1 
    260                DO ji = fs_2, fs_jpim1   ! vector opt. 
    261                   zbtr      = btr2(ji,jj) / fse3t(ji,jj,jk) 
    262                   z_hdivn_y = (  e1v(ji,  jj) * fse3v(ji,jj  ,jk) * pvn(ji,jj  ,jk)          & 
    263                      &         - e1v(ji,jj-1) * fse3v(ji,jj-1,jk) * pvn(ji,jj-1,jk) ) * zbtr 
    264                   ! 
    265                   ztrdt(ji,jj,jk) = - zbtr * ( zwy(ji,jj,jk) - zwy(ji,jj-1,jk) ) + tn(ji,jj,jk) * z_hdivn_y           
    266                   ztrds(ji,jj,jk) = - zbtr * ( zwz(ji,jj,jk) - zwz(ji,jj-1,jk) ) + sn(ji,jj,jk) * z_hdivn_y 
    267                END DO 
    268             END DO 
    269          END DO 
    270          CALL trd_mod(ztrdt, ztrds, jptra_trd_yad, 'TRA', kt) 
    271          ! 
    272          ztrdt(:,:,:) = ta(:,:,:)   ;   ztrds(:,:,:) = sa(:,:,:)       ! Save the horizontal up-to-date ta/sa trends 
    273          ! 
    274       ENDIF 
    275  
    276       IF( ln_diaptr .AND. ( MOD( kt, nf_ptr ) == 0 ) ) THEN      ! "zonal" mean advective heat and salt transport  
    277          pht_adv(:) = ptr_vj( zwy(:,:,:) ) 
    278          pst_adv(:) = ptr_vj( zwz(:,:,:) ) 
    279       ENDIF 
    280  
    281       IF(ln_ctl)   CALL prt_ctl( tab3d_1=ta, clinfo1=' cen2 had  - Ta: ', mask1=tmask, & 
    282          &                       tab3d_2=sa, clinfo2=            ' Sa: ', mask2=tmask, clinfo3='tra' ) 
    283  
    284  
    285       ! II. Vertical advection 
    286       !     ================== 
    287       ! 
    288       zwx(:,:,jpk) = 0.e0     ;    zwy(:,:,jpk) = 0.e0      ! Bottom value  : flux set to zero 
    289       ! 
    290       IF( lk_vvl ) THEN                                     ! Surface value : zero in variable volume 
    291          zwx(:,:, 1 ) = 0.e0    ;    zwy(:,:, 1 ) = 0.e0 
    292       ELSE                                                  !               : linear free surface case 
    293          zwx(:,:, 1 ) = pwn(:,:,1) * tn(:,:,1) 
    294          zwy(:,:, 1 ) = pwn(:,:,1) * sn(:,:,1) 
    295       ENDIF 
    296       ! 
    297       DO jk = 2, jpk              ! Second order centered tracer flux at w-point 
    298          DO jj = 2, jpjm1 
    299             DO ji = fs_2, fs_jpim1   ! vector opt. 
    300                zcofk = MAX( zind(ji,jj,jk-1), zind(ji,jj,jk) )      ! upstream indicator 
    301                zhw = 0.5 * pwn(ji,jj,jk)                            ! velocity * 1/2 
    302                ! 
    303                zfp_w = zhw + ABS( zhw )                             ! upstream scheme 
    304                zfm_w = zhw - ABS( zhw ) 
    305                zupst = zfp_w * tb(ji,jj,jk) + zfm_w * tb(ji,jj,jk-1) 
    306                zupss = zfp_w * sb(ji,jj,jk) + zfm_w * sb(ji,jj,jk-1) 
    307                ! 
    308                zcent = zhw * ( tn(ji,jj,jk) + tn(ji,jj,jk-1) )      ! centered scheme 
    309                zcens = zhw * ( sn(ji,jj,jk) + sn(ji,jj,jk-1) ) 
    310                ! 
    311                zwx(ji,jj,jk) = zcofk * zupst + (1.-zcofk) * zcent   ! mixed centered / upstream scheme 
    312                zwy(ji,jj,jk) = zcofk * zupss + (1.-zcofk) * zcens 
    313             END DO 
    314          END DO 
    315       END DO 
    316       ! 
    317       DO jk = 1, jpkm1            ! divergence of Tracer flux added to the general trend 
    318          DO jj = 2, jpjm1 
    319             DO ji = fs_2, fs_jpim1   ! vector opt. 
    320                ze3tr = 1. / fse3t(ji,jj,jk) 
    321                ta(ji,jj,jk) =  ta(ji,jj,jk) - ze3tr * ( zwx(ji,jj,jk) - zwx(ji,jj,jk+1) ) 
    322                sa(ji,jj,jk) =  sa(ji,jj,jk) - ze3tr * ( zwy(ji,jj,jk) - zwy(ji,jj,jk+1) ) 
    323             END DO 
    324          END DO 
    325       END DO 
    326  
    327       IF( l_trdtra ) THEN      ! Save the vertical advective trends for diagnostic (W gradz(T) trends) 
    328          DO jk = 1, jpkm1 
    329             DO jj = 2, jpjm1 
    330                DO ji = fs_2, fs_jpim1   ! vector opt. 
    331                   zbtr      = btr2(ji,jj) / fse3t(ji,jj,jk) 
    332                   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) 
    333                   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) 
    334                   ! 
    335                   z_hdivn   = (z_hdivn_x + z_hdivn_y) * zbtr 
    336                   ztrdt(ji,jj,jk) = ta(ji,jj,jk) - ztrdt(ji,jj,jk) - tn(ji,jj,jk) * z_hdivn  
    337                   ztrds(ji,jj,jk) = sa(ji,jj,jk) - ztrds(ji,jj,jk) - sn(ji,jj,jk) * z_hdivn 
    338                END DO 
    339             END DO 
    340          END DO 
    341          CALL trd_mod(ztrdt, ztrds, jptra_trd_zad, 'TRA', kt) 
    342       ENDIF 
    343  
    344       ! write avmb, avtb in restart (traadv_cen2 requires a modified avmb, avtb that are 
     250 
     251         !                                 ! trend diagnostics (contribution of upstream fluxes) 
     252         IF( l_trd ) THEN 
     253            CALL trd_tra( kt, cdtype, jn, jptra_trd_xad, zwx, pun, ptn(:,:,:,jn) ) 
     254            CALL trd_tra( kt, cdtype, jn, jptra_trd_yad, zwy, pvn, ptn(:,:,:,jn) ) 
     255            CALL trd_tra( kt, cdtype, jn, jptra_trd_zad, zwz, pwn, ptn(:,:,:,jn) ) 
     256         END IF 
     257         !                                 ! "Poleward" heat and salt transports (contribution of upstream fluxes) 
     258         IF( cdtype == 'TRA' .AND. ln_diaptr .AND. ( MOD( kt, nn_fptr ) == 0 ) ) THEN   
     259           IF( jn == jp_tem )  htr_adv(:) = ptr_vj( zwy(:,:,:) ) 
     260           IF( jn == jp_sal )  str_adv(:) = ptr_vj( zwy(:,:,:) ) 
     261         ENDIF 
     262         ! 
     263      ENDDO 
     264 
    345265      ! ---------------------------  required in restart file to ensure restartability) 
    346266      ! avmb, avtb will be read in zdfini in restart case as they are used in zdftke, kpp etc... 
    347       IF( lrst_oce ) THEN 
     267      IF( lrst_oce .AND. cdtype == 'TRA' ) THEN 
    348268         CALL iom_rstput( kt, nitrst, numrow, 'avmb', avmb ) 
    349269         CALL iom_rstput( kt, nitrst, numrow, 'avtb', avtb ) 
    350270      ENDIF 
    351  
    352       IF(ln_ctl)   CALL prt_ctl( tab3d_1=ta, clinfo1=' cen2 zad  - Ta: ', mask1=tmask, & 
    353          &                       tab3d_2=sa, clinfo2=            ' Sa: ', mask2=tmask, clinfo3='tra' ) 
    354271      ! 
    355272   END SUBROUTINE tra_adv_cen2 
Note: See TracChangeset for help on using the changeset viewer.