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 6140 for trunk/NEMOGCM/NEMO/OPA_SRC/TRA/traadv_fct.F90 – NEMO

Ignore:
Timestamp:
2015-12-21T12:35:23+01:00 (8 years ago)
Author:
timgraham
Message:

Merge of branches/2015/dev_merge_2015 back into trunk. Merge excludes NEMOGCM/TOOLS/OBSTOOLS/ for now due to issues with the change of file type. Will sort these manually with further commits.

Branch merged as follows:
In the working copy of branch ran:
svn merge svn+ssh://forge.ipsl.jussieu.fr/ipsl/forge/projets/nemo/svn/trunk@HEAD
Small conflicts due to bug fixes applied to trunk since the dev_merge_2015 was copied. Bug fixes were applied to the branch as well so these were easy to resolve.
Branch committed at this stage

In working copy run:
svn switch svn+ssh://forge.ipsl.jussieu.fr/ipsl/forge/projets/nemo/svn/trunk
to switch working copy

Run:
svn merge --reintegrate svn+ssh://forge.ipsl.jussieu.fr/ipsl/forge/projets/nemo/svn/branches/2015/dev_merge_2015
to merge the branch into the trunk and then commit - no conflicts at this stage.

File:
1 edited

Legend:

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

    r5930 r6140  
    3939 
    4040   !! * Substitutions 
    41 #  include "domzgr_substitute.h90" 
    4241#  include "vectopt_loop_substitute.h90" 
    4342   !!---------------------------------------------------------------------- 
     
    5352      !!                  ***  ROUTINE tra_adv_fct  *** 
    5453      !!  
    55       !! **  Purpose :   Compute the now trend due to total advection of  
    56       !!       tracers and add it to the general trend of tracer equations 
     54      !! **  Purpose :   Compute the now trend due to total advection of tracers 
     55      !!               and add it to the general trend of tracer equations 
    5756      !! 
    5857      !! **  Method  : - 2nd or 4th FCT scheme on the horizontal direction 
    5958      !!               (choice through the value of kn_fct) 
    60       !!               - 4th order compact scheme on the vertical  
     59      !!               - on the vertical the 4th order is a compact scheme  
    6160      !!               - corrected flux (monotonic correction)  
    6261      !! 
    63       !! ** Action : - update (pta) with the now advective tracer trends 
    64       !!             - send the trends for further diagnostics 
     62      !! ** Action : - update pta  with the now advective tracer trends 
     63      !!             - send trends to trdtra module for further diagnostcs (l_trdtra=T) 
     64      !!             - htr_adv, str_adv : poleward advective heat and salt transport (ln_diaptr=T) 
    6565      !!---------------------------------------------------------------------- 
    6666      INTEGER                              , INTENT(in   ) ::   kt              ! ocean time-step index 
     
    7070      INTEGER                              , INTENT(in   ) ::   kn_fct_h        ! order of the FCT scheme (=2 or 4) 
    7171      INTEGER                              , INTENT(in   ) ::   kn_fct_v        ! order of the FCT scheme (=2 or 4) 
    72       REAL(wp), DIMENSION(        jpk     ), INTENT(in   ) ::   p2dt            ! vertical profile of tracer time-step 
     72      REAL(wp)                             , INTENT(in   ) ::   p2dt            ! tracer time-step 
    7373      REAL(wp), DIMENSION(jpi,jpj,jpk     ), INTENT(in   ) ::   pun, pvn, pwn   ! 3 ocean velocity components 
    7474      REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(in   ) ::   ptb, ptn        ! before and now tracer fields 
     
    7676      ! 
    7777      INTEGER  ::   ji, jj, jk, jn                           ! dummy loop indices   
    78       REAL(wp) ::   z2dtt, ztra                              ! local scalar 
     78      REAL(wp) ::   ztra                                     ! local scalar 
    7979      REAL(wp) ::   zfp_ui, zfp_vj, zfp_wk, zC2t_u, zC4t_u   !   -      - 
    8080      REAL(wp) ::   zfm_ui, zfm_vj, zfm_wk, zC2t_v, zC4t_v   !   -      - 
     
    101101      ENDIF 
    102102      ! 
    103       !                                         ! surface & bottom value : flux set to zero one for all 
    104       IF( lk_vvl )   zwz(:,:, 1 ) = 0._wp                ! except at the surface in linear free surface case 
     103      !                          ! surface & bottom value : flux set to zero one for all 
     104      zwz(:,:, 1 ) = 0._wp             
    105105      zwx(:,:,jpk) = 0._wp   ;   zwy(:,:,jpk) = 0._wp    ;    zwz(:,:,jpk) = 0._wp 
    106106      ! 
    107107      zwi(:,:,:) = 0._wp         
    108       !                                                          ! =========== 
    109       DO jn = 1, kjpt                                            ! tracer loop 
    110          !                                                       ! =========== 
     108      ! 
     109      DO jn = 1, kjpt            !==  loop over the tracers  ==! 
    111110         ! 
    112111         !        !==  upstream advection with initial mass fluxes & intermediate update  ==! 
     
    126125         END DO 
    127126         !                    !* upstream tracer flux in the k direction *! 
    128          DO jk = 2, jpkm1         ! Interior value ( multiplied by wmask) 
     127         DO jk = 2, jpkm1        ! Interior value ( multiplied by wmask) 
    129128            DO jj = 1, jpj 
    130129               DO ji = 1, jpi 
     
    135134            END DO 
    136135         END DO 
    137          !                     
    138          IF(.NOT.lk_vvl ) THEN   ! top ocean value (only in linear free surface as zwz has been w-masked) 
     136         IF( ln_linssh ) THEN    ! top ocean value (only in linear free surface as zwz has been w-masked) 
    139137            IF( ln_isfcav ) THEN             ! top of the ice-shelf cavities and at the ocean surface 
    140138               DO jj = 1, jpj 
     
    149147         !                
    150148         DO jk = 1, jpkm1     !* trend and after field with monotonic scheme 
    151             z2dtt = p2dt(jk) 
    152149            DO jj = 2, jpjm1 
    153150               DO ji = fs_2, fs_jpim1   ! vector opt. 
     
    155152                  ztra = - (  zwx(ji,jj,jk) - zwx(ji-1,jj  ,jk  )   & 
    156153                     &      + zwy(ji,jj,jk) - zwy(ji  ,jj-1,jk  )   & 
    157                      &      + zwz(ji,jj,jk) - zwz(ji  ,jj  ,jk+1) ) / ( e1e2t(ji,jj) * fse3t_n(ji,jj,jk) ) 
     154                     &      + zwz(ji,jj,jk) - zwz(ji  ,jj  ,jk+1) ) * r1_e1e2t(ji,jj) / e3t_n(ji,jj,jk) 
    158155                  ! update and guess with monotonic sheme 
    159156!!gm why tmask added in the two following lines ???    the mask is done in tranxt ! 
    160157                  pta(ji,jj,jk,jn) =   pta(ji,jj,jk,jn)         + ztra   * tmask(ji,jj,jk) 
    161                   zwi(ji,jj,jk)    = ( ptb(ji,jj,jk,jn) + z2dtt * ztra ) * tmask(ji,jj,jk) 
     158                  zwi(ji,jj,jk)    = ( ptb(ji,jj,jk,jn) + p2dt * ztra ) * tmask(ji,jj,jk) 
    162159               END DO 
    163160            END DO 
     
    174171         ENDIF 
    175172         ! 
    176          ! 
    177173         !        !==  anti-diffusive flux : high order minus low order  ==! 
    178174         ! 
    179          SELECT CASE( kn_fct_h )         !* horizontal anti-diffusive fluxes 
    180          ! 
    181          CASE(  2  )                         ! 2nd order centered 
     175         SELECT CASE( kn_fct_h )    !* horizontal anti-diffusive fluxes 
     176         ! 
     177         CASE(  2  )                   !- 2nd order centered 
    182178            DO jk = 1, jpkm1 
    183179               DO jj = 1, jpjm1 
     
    189185            END DO 
    190186            ! 
    191          CASE(  4  )                         ! 4th order centered 
    192             zltu(:,:,jpk) = 0._wp                            ! Bottom value : flux set to zero 
     187         CASE(  4  )                   !- 4th order centered 
     188            zltu(:,:,jpk) = 0._wp            ! Bottom value : flux set to zero 
    193189            zltv(:,:,jpk) = 0._wp 
    194             DO jk = 1, jpkm1                                 ! Laplacian 
    195                DO jj = 1, jpjm1                                   ! First derivative (gradient) 
     190            DO jk = 1, jpkm1                 ! Laplacian 
     191               DO jj = 1, jpjm1                    ! 1st derivative (gradient) 
    196192                  DO ji = 1, fs_jpim1   ! vector opt. 
    197193                     ztu(ji,jj,jk) = ( ptn(ji+1,jj  ,jk,jn) - ptn(ji,jj,jk,jn) ) * umask(ji,jj,jk) 
     
    199195                  END DO 
    200196               END DO 
    201                DO jj = 2, jpjm1                                   !  
     197               DO jj = 2, jpjm1                    ! 2nd derivative * 1/ 6 
    202198                  DO ji = fs_2, fs_jpim1   ! vector opt. 
    203199                     zltu(ji,jj,jk) = (  ztu(ji,jj,jk) + ztu(ji-1,jj,jk)  ) * r1_6 
     
    206202               END DO 
    207203            END DO 
    208             ! 
    209204            CALL lbc_lnk( zltu, 'T', 1. )   ;    CALL lbc_lnk( zltv, 'T', 1. )   ! Lateral boundary cond. (unchanged sgn) 
    210205            ! 
    211             DO jk = 1, jpkm1                                 ! Horizontal advective fluxes 
     206            DO jk = 1, jpkm1                 ! Horizontal advective fluxes 
    212207               DO jj = 1, jpjm1 
    213208                  DO ji = 1, fs_jpim1   ! vector opt. 
     
    221216            END DO          
    222217            ! 
    223          CASE(  41 )                         ! 4th order centered       ==>>   !!gm coding attempt   need to be tested 
    224             ztu(:,:,jpk) = 0._wp                             ! Bottom value : flux set to zero 
     218         CASE(  41 )                   !- 4th order centered       ==>>   !!gm coding attempt   need to be tested 
     219            ztu(:,:,jpk) = 0._wp             ! Bottom value : flux set to zero 
    225220            ztv(:,:,jpk) = 0._wp 
    226             DO jk = 1, jpkm1                                 ! gradient 
    227                DO jj = 1, jpjm1                                   ! First derivative (gradient) 
     221            DO jk = 1, jpkm1                 ! 1st derivative (gradient) 
     222               DO jj = 1, jpjm1 
    228223                  DO ji = 1, fs_jpim1   ! vector opt. 
    229224                     ztu(ji,jj,jk) = ( ptn(ji+1,jj  ,jk,jn) - ptn(ji,jj,jk,jn) ) * umask(ji,jj,jk) 
     
    234229            CALL lbc_lnk( ztu, 'U', -1. )   ;    CALL lbc_lnk( ztv, 'V', -1. )   ! Lateral boundary cond. (unchanged sgn) 
    235230            ! 
    236             DO jk = 1, jpkm1                                 ! Horizontal advective fluxes 
     231            DO jk = 1, jpkm1                 ! Horizontal advective fluxes 
    237232               DO jj = 2, jpjm1 
    238233                  DO ji = 2, fs_jpim1   ! vector opt. 
     
    250245            ! 
    251246         END SELECT 
    252          !                                !* vertical anti-diffusive fluxes 
    253          SELECT CASE( kn_fct_v )                ! Interior values (w-masked) 
    254          ! 
    255          CASE(  2  )                                  ! 2nd order centered 
     247         !                       
     248         SELECT CASE( kn_fct_v )    !* vertical anti-diffusive fluxes (w-masked interior values) 
     249         ! 
     250         CASE(  2  )                   !- 2nd order centered 
    256251            DO jk = 2, jpkm1     
    257252               DO jj = 2, jpjm1 
    258253                  DO ji = fs_2, fs_jpim1 
    259                      zwz(ji,jj,jk) =  ( 0.5_wp * pwn(ji,jj,jk) * ( ptn(ji,jj,jk,jn) + ptn(ji,jj,jk-1,jn) )   & 
    260                                        - zwz(ji,jj,jk) ) * wmask(ji,jj,jk) 
    261                   END DO 
    262                END DO 
    263             END DO 
    264             ! 
    265          CASE(  4  )                                  ! 4th order COMPACT 
    266             !     
    267             CALL interp_4th_cpt( ptn(:,:,:,jn) , ztw )         ! COMPACT interpolation of T at w-point 
    268             ! 
     254                     zwz(ji,jj,jk) =  (  pwn(ji,jj,jk) * 0.5_wp * ( ptn(ji,jj,jk,jn) + ptn(ji,jj,jk-1,jn) )   & 
     255                        &              - zwz(ji,jj,jk)  ) * wmask(ji,jj,jk) 
     256                  END DO 
     257               END DO 
     258            END DO 
     259            ! 
     260         CASE(  4  )                   !- 4th order COMPACT 
     261            CALL interp_4th_cpt( ptn(:,:,:,jn) , ztw )   ! zwt = COMPACT interpolation of T at w-point 
    269262            DO jk = 2, jpkm1 
    270263               DO jj = 2, jpjm1 
     
    276269            ! 
    277270         END SELECT 
    278          !                                      ! top ocean value: high order = upstream  ==>>  zwz=0 
    279          zwz(:,:, 1 ) = 0._wp                   ! only ocean surface as interior zwz values have been w-masked 
     271         IF( ln_linssh ) THEN    ! top ocean value: high order = upstream  ==>>  zwz=0 
     272            zwz(:,:,1) = 0._wp   ! only ocean surface as interior zwz values have been w-masked 
     273         ENDIF 
    280274         ! 
    281275         CALL lbc_lnk( zwx, 'U', -1. )   ;   CALL lbc_lnk( zwy, 'V', -1. )         ! Lateral bondary conditions 
    282276         CALL lbc_lnk( zwz, 'W',  1. ) 
    283  
     277         ! 
    284278         !        !==  monotonicity algorithm  ==! 
    285279         ! 
    286280         CALL nonosc( ptb(:,:,:,jn), zwx, zwy, zwz, zwi, p2dt ) 
    287  
    288  
     281         ! 
    289282         !        !==  final trend with corrected fluxes  ==! 
    290283         ! 
     
    295288                     &                                   + zwy(ji,jj,jk) - zwy(ji  ,jj-1,jk  )   & 
    296289                     &                                   + zwz(ji,jj,jk) - zwz(ji  ,jj  ,jk+1) ) & 
    297                      &                                / ( e1e2t(ji,jj) * fse3t(ji,jj,jk) ) 
    298                END DO 
    299             END DO 
    300          END DO 
    301          ! 
    302          IF( l_trd ) THEN                 ! trend diagnostics (contribution of upstream fluxes) 
     290                     &                                * r1_e1e2t(ji,jj) / e3t_n(ji,jj,jk) 
     291               END DO 
     292            END DO 
     293         END DO 
     294         ! 
     295         IF( l_trd ) THEN     ! trend diagnostics (contribution of upstream fluxes) 
    303296            ztrdx(:,:,:) = ztrdx(:,:,:) + zwx(:,:,:)  ! <<< Add to previously computed 
    304297            ztrdy(:,:,:) = ztrdy(:,:,:) + zwy(:,:,:)  ! <<< Add to previously computed 
     
    311304            CALL wrk_dealloc( jpi,jpj,jpk,   ztrdx, ztrdy, ztrdz ) 
    312305         END IF 
    313          !                                 ! "Poleward" heat and salt transports (contribution of upstream fluxes) 
     306         !                    ! "Poleward" heat and salt transports (contribution of upstream fluxes) 
    314307         IF( cdtype == 'TRA' .AND. ln_diaptr ) THEN   
    315            IF( jn == jp_tem )  htr_adv(:) = ptr_sj( zwy(:,:,:) ) + htr_adv(:) 
    316            IF( jn == jp_sal )  str_adv(:) = ptr_sj( zwy(:,:,:) ) + str_adv(:) 
     308           IF( jn == jp_tem )   htr_adv(:) = htr_adv(:) + ptr_sj( zwy(:,:,:) ) 
     309           IF( jn == jp_sal )   str_adv(:) = str_adv(:) + ptr_sj( zwy(:,:,:) ) 
    317310         ENDIF 
    318311         ! 
    319       END DO 
     312      END DO                     ! end of tracer loop 
    320313      ! 
    321314      CALL wrk_dealloc( jpi,jpj,jpk,    zwi, zwx, zwy, zwz, ztu, ztv, zltu, zltv, ztw ) 
     
    348341      INTEGER                              , INTENT(in   ) ::   kjpt            ! number of tracers 
    349342      INTEGER                              , INTENT(in   ) ::   kn_fct_zts      ! number of number of vertical sub-timesteps 
    350       REAL(wp), DIMENSION(        jpk     ), INTENT(in   ) ::   p2dt            ! vertical profile of tracer time-step 
     343      REAL(wp)                             , INTENT(in   ) ::   p2dt            ! tracer time-step 
    351344      REAL(wp), DIMENSION(jpi,jpj,jpk     ), INTENT(in   ) ::   pun, pvn, pwn   ! 3 ocean velocity components 
    352345      REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(in   ) ::   ptb, ptn        ! before and now tracer fields 
     
    354347      ! 
    355348      REAL(wp), DIMENSION( jpk )                           ::   zts             ! length of sub-timestep for vertical advection 
    356       REAL(wp), DIMENSION( jpk )                           ::   zr_p2dt         ! reciprocal of tracer timestep 
     349      REAL(wp)                                             ::   zr_p2dt         ! reciprocal of tracer timestep 
    357350      INTEGER  ::   ji, jj, jk, jl, jn       ! dummy loop indices   
    358351      INTEGER  ::   jtb, jtn, jta   ! sub timestep pointers for leap-frog/euler forward steps 
    359352      INTEGER  ::   jtaken          ! toggle for collecting appropriate fluxes from sub timesteps 
    360353      REAL(wp) ::   z_rzts          ! Fractional length of Euler forward sub-timestep for vertical advection 
    361       REAL(wp) ::   z2dtt, ztra              ! local scalar 
     354      REAL(wp) ::   ztra            ! local scalar 
    362355      REAL(wp) ::   zfp_ui, zfp_vj, zfp_wk   !   -      - 
    363356      REAL(wp) ::   zfm_ui, zfm_vj, zfm_wk   !   -      - 
     
    390383      zwi(:,:,:) = 0._wp 
    391384      z_rzts = 1._wp / REAL( kn_fct_zts, wp ) 
    392       zr_p2dt(:) = 1._wp / p2dt(:) 
     385      zr_p2dt = 1._wp / p2dt 
     386      ! 
     387      ! surface & Bottom value : flux set to zero for all tracers 
     388      zwz(:,:, 1 ) = 0._wp 
     389      zwx(:,:,jpk) = 0._wp   ;    zwz(:,:,jpk) = 0._wp 
     390      zwy(:,:,jpk) = 0._wp   ;    zwi(:,:,jpk) = 0._wp 
    393391      ! 
    394392      !                                                          ! =========== 
    395393      DO jn = 1, kjpt                                            ! tracer loop 
    396394         !                                                       ! =========== 
    397          ! 1. Bottom value : flux set to zero 
    398          ! ---------------------------------- 
    399          zwx(:,:,jpk) = 0._wp   ;    zwz(:,:,jpk) = 0._wp 
    400          zwy(:,:,jpk) = 0._wp   ;    zwi(:,:,jpk) = 0._wp 
    401  
    402          ! 2. upstream advection with initial mass fluxes & intermediate update 
    403          ! -------------------------------------------------------------------- 
    404          ! upstream tracer flux in the i and j direction 
    405          DO jk = 1, jpkm1 
     395         ! 
     396         ! Upstream advection with initial mass fluxes & intermediate update 
     397         DO jk = 1, jpkm1        ! upstream tracer flux in the i and j direction 
    406398            DO jj = 1, jpjm1 
    407399               DO ji = 1, fs_jpim1   ! vector opt. 
     
    416408            END DO 
    417409         END DO 
    418  
    419          ! upstream tracer flux in the k direction 
    420          DO jk = 2, jpkm1         ! Interior value 
     410         !                       ! upstream tracer flux in the k direction 
     411         DO jk = 2, jpkm1              ! Interior value 
    421412            DO jj = 1, jpj 
    422413               DO ji = 1, jpi 
     
    427418            END DO 
    428419         END DO 
    429          !                       ! top value 
    430          IF( lk_vvl ) THEN             ! variable volume: only k=1 as zwz is multiplied by wmask 
    431             zwz(:,:, 1 ) = 0._wp 
    432          ELSE                          ! linear free surface 
    433             IF( ln_isfcav ) THEN             ! ice-shelf cavities 
     420         IF( ln_linssh ) THEN          ! top value : linear free surface case only (as zwz is multiplied by wmask) 
     421            IF( ln_isfcav ) THEN             ! ice-shelf cavities: top value 
    434422               DO jj = 1, jpj 
    435423                  DO ji = 1, jpi 
     
    437425                  END DO 
    438426               END DO    
    439             ELSE                             ! standard case 
     427            ELSE                             ! no cavities, surface value 
    440428               zwz(:,:,1) = pwn(:,:,1) * ptb(:,:,1,jn) 
    441429            ENDIF 
     
    443431         ! 
    444432         DO jk = 1, jpkm1         ! total advective trend 
    445             z2dtt = p2dt(jk) 
    446433            DO jj = 2, jpjm1 
    447434               DO ji = fs_2, fs_jpim1   ! vector opt. 
    448                   ! total intermediate advective trends 
     435                  !                             ! total intermediate advective trends 
    449436                  ztra = - (  zwx(ji,jj,jk) - zwx(ji-1,jj  ,jk  )   & 
    450437                     &      + zwy(ji,jj,jk) - zwy(ji  ,jj-1,jk  )   & 
    451                      &      + zwz(ji,jj,jk) - zwz(ji  ,jj  ,jk+1) ) / ( e1e2t(ji,jj) * fse3t_n(ji,jj,jk) ) 
    452                   ! update and guess with monotonic sheme 
     438                     &      + zwz(ji,jj,jk) - zwz(ji  ,jj  ,jk+1)   ) * r1_e1e2t(ji,jj) / e3t_n(ji,jj,jk) 
     439                  !                             ! update and guess with monotonic sheme 
    453440                  pta(ji,jj,jk,jn) =   pta(ji,jj,jk,jn)         + ztra 
    454                   zwi(ji,jj,jk)    = ( ptb(ji,jj,jk,jn) + z2dtt * ztra ) * tmask(ji,jj,jk) 
     441                  zwi(ji,jj,jk)    = ( ptb(ji,jj,jk,jn) + p2dt * ztra ) * tmask(ji,jj,jk) 
    455442               END DO 
    456443            END DO 
     
    497484            END DO 
    498485         END DO 
    499        
     486         ! 
    500487         !                                !* vertical anti-diffusive flux 
    501488         zwz_sav(:,:,:)   = zwz(:,:,:) 
    502489         ztrs   (:,:,:,1) = ptb(:,:,:,jn) 
    503490         zwzts  (:,:,:)   = 0._wp 
    504          IF( lk_vvl )   zwz(:,:, 1 ) = 0._wp    ! surface value set to zero in vvl case 
    505491         ! 
    506492         DO jl = 1, kn_fct_zts                  ! Start of sub timestepping loop 
     
    508494            IF( jl == 1 ) THEN                        ! Euler forward to kick things off 
    509495               jtb = 1   ;   jtn = 1   ;   jta = 2 
    510                zts(:) = p2dt(:) * z_rzts 
     496               zts(:) = p2dt * z_rzts 
    511497               jtaken = MOD( kn_fct_zts + 1 , 2)            ! Toggle to collect every second flux 
    512498               !                                            ! starting at jl =1 if kn_fct_zts is odd;  
     
    514500            ELSEIF( jl == 2 ) THEN                    ! First leapfrog step 
    515501               jtb = 1   ;   jtn = 2   ;   jta = 3 
    516                zts(:) = 2._wp * p2dt(:) * z_rzts 
     502               zts(:) = 2._wp * p2dt * z_rzts 
    517503            ELSE                                      ! Shuffle pointers for subsequent leapfrog steps 
    518504               jtb = MOD(jtb,3) + 1 
     
    528514               END DO 
    529515            END DO 
    530             IF(.NOT.lk_vvl ) THEN                    ! top value (only in linear free surface case) 
     516            IF( ln_linssh ) THEN                    ! top value (only in linear free surface case) 
    531517               IF( ln_isfcav ) THEN                      ! ice-shelf cavities 
    532518                  DO jj = 1, jpj 
     
    535521                     END DO 
    536522                  END DO    
    537                ELSE                                      ! standard case 
     523               ELSE                                      ! no ocean cavities 
    538524                  zwz(:,:,1) = pwn(:,:,1) * ptb(:,:,1,jn) 
    539525               ENDIF 
     
    547533                     ztrs(ji,jj,jk,jta) = ztrs(ji,jj,jk,jtb)                                                 & 
    548534                        &               - zts(jk) * (  zhdiv(ji,jj,jk) + zwz(ji,jj,jk) - zwz(ji,jj,jk+1) )   & 
    549                         &                         / ( e1e2t(ji,jj) * fse3t(ji,jj,jk) ) 
     535                        &                         * r1_e1e2t(ji,jj) / e3t_n(ji,jj,jk) 
    550536                  END DO 
    551537               END DO 
     
    557543            DO jj = 2, jpjm1 
    558544               DO ji = fs_2, fs_jpim1 
    559                   zwz(ji,jj,jk) = ( zwzts(ji,jj,jk) * zr_p2dt(jk) - zwz_sav(ji,jj,jk) ) * wmask(ji,jj,jk) 
     545                  zwz(ji,jj,jk) = ( zwzts(ji,jj,jk) * zr_p2dt - zwz_sav(ji,jj,jk) ) * wmask(ji,jj,jk) 
    560546               END DO 
    561547            END DO 
     
    576562                  pta(ji,jj,jk,jn) = pta(ji,jj,jk,jn) + (   zwy(ji,jj,jk) - zwy(ji  ,jj-1,jk  )       & 
    577563                     &                                    + zwz(ji,jj,jk) - zwz(ji  ,jj  ,jk+1)   )   & 
    578                      &                                / ( e1e2t(ji,jj) * fse3t_n(ji,jj,jk) ) 
     564                     &                                * r1_e1e2t(ji,jj) / e3t_n(ji,jj,jk) 
    579565               END DO 
    580566            END DO 
     
    623609      !!       in-space based differencing for fluid 
    624610      !!---------------------------------------------------------------------- 
    625       REAL(wp), DIMENSION(jpk)         , INTENT(in   ) ::   p2dt            ! vertical profile of tracer time-step 
     611      REAL(wp)                         , INTENT(in   ) ::   p2dt            ! tracer time-step 
    626612      REAL(wp), DIMENSION (jpi,jpj,jpk), INTENT(in   ) ::   pbef, paft      ! before & after field 
    627613      REAL(wp), DIMENSION (jpi,jpj,jpk), INTENT(inout) ::   paa, pbb, pcc   ! monotonic fluxes in the 3 directions 
     
    629615      INTEGER  ::   ji, jj, jk   ! dummy loop indices 
    630616      INTEGER  ::   ikm1         ! local integer 
    631       REAL(wp) ::   zpos, zneg, zbt, za, zb, zc, zbig, zrtrn, z2dtt   ! local scalars 
     617      REAL(wp) ::   zpos, zneg, zbt, za, zb, zc, zbig, zrtrn    ! local scalars 
    632618      REAL(wp) ::   zau, zbu, zcu, zav, zbv, zcv, zup, zdo            !   -      - 
    633619      REAL(wp), POINTER, DIMENSION(:,:,:) :: zbetup, zbetdo, zbup, zbdo 
     
    652638      DO jk = 1, jpkm1 
    653639         ikm1 = MAX(jk-1,1) 
    654          z2dtt = p2dt(jk) 
    655640         DO jj = 2, jpjm1 
    656641            DO ji = fs_2, fs_jpim1   ! vector opt. 
     
    679664 
    680665               ! up & down beta terms 
    681                zbt = e1t(ji,jj) * e2t(ji,jj) * fse3t(ji,jj,jk) / z2dtt 
     666               zbt = e1e2t(ji,jj) * e3t_n(ji,jj,jk) / p2dt 
    682667               zbetup(ji,jj,jk) = ( zup            - paft(ji,jj,jk) ) / ( zpos + zrtrn ) * zbt 
    683668               zbetdo(ji,jj,jk) = ( paft(ji,jj,jk) - zdo            ) / ( zneg + zrtrn ) * zbt 
Note: See TracChangeset for help on using the changeset viewer.