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 5883 for branches/2015/dev_r5836_NOC3_vvl_by_default/NEMOGCM/NEMO/OPA_SRC/TRA/traadv_fct.F90 – NEMO

Ignore:
Timestamp:
2015-11-13T08:01:08+01:00 (8 years ago)
Author:
gm
Message:

#1613: vvl by default: TRA/TRC remove optimization associated with linear free surface

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/2015/dev_r5836_NOC3_vvl_by_default/NEMOGCM/NEMO/OPA_SRC/TRA/traadv_fct.F90

    r5866 r5883  
    5353      !!                  ***  ROUTINE tra_adv_fct  *** 
    5454      !!  
    55       !! **  Purpose :   Compute the now trend due to total advection of  
    56       !!       tracers and add it to the general trend of tracer equations 
     55      !! **  Purpose :   Compute the now trend due to total advection of tracers 
     56      !!               and add it to the general trend of tracer equations 
    5757      !! 
    5858      !! **  Method  : - 2nd or 4th FCT scheme on the horizontal direction 
    5959      !!               (choice through the value of kn_fct) 
    60       !!               - 4th order compact scheme on the vertical  
     60      !!               - on the vertical the 4th order is a compact scheme  
    6161      !!               - corrected flux (monotonic correction)  
    6262      !! 
    63       !! ** Action : - update (pta) with the now advective tracer trends 
    64       !!             - send the trends for further diagnostics 
     63      !! ** Action : - update pta  with the now advective tracer trends 
     64      !!             - send trends to trdtra module for further diagnostcs (l_trdtra=T) 
     65      !!             - htr_adv, str_adv : poleward advective heat and salt transport (ln_diaptr=T) 
    6566      !!---------------------------------------------------------------------- 
    6667      INTEGER                              , INTENT(in   ) ::   kt              ! ocean time-step index 
     
    101102      ENDIF 
    102103      ! 
    103       !                                         ! surface & bottom value : flux set to zero one for all 
    104       IF( .NOT.ln_linssh )   zwz(:,:, 1 ) = 0._wp                ! except at the surface in linear free surface case 
     104      !                          ! surface & bottom value : flux set to zero one for all 
     105      zwz(:,:, 1 ) = 0._wp             
    105106      zwx(:,:,jpk) = 0._wp   ;   zwy(:,:,jpk) = 0._wp    ;    zwz(:,:,jpk) = 0._wp 
    106107      ! 
    107108      zwi(:,:,:) = 0._wp         
    108       !                                                          ! =========== 
    109       DO jn = 1, kjpt                                            ! tracer loop 
    110          !                                                       ! =========== 
     109      ! 
     110      DO jn = 1, kjpt            !==  loop over the tracers  ==! 
    111111         ! 
    112112         !        !==  upstream advection with initial mass fluxes & intermediate update  ==! 
     
    126126         END DO 
    127127         !                    !* upstream tracer flux in the k direction *! 
    128          DO jk = 2, jpkm1         ! Interior value ( multiplied by wmask) 
     128         DO jk = 2, jpkm1        ! Interior value ( multiplied by wmask) 
    129129            DO jj = 1, jpj 
    130130               DO ji = 1, jpi 
     
    135135            END DO 
    136136         END DO 
    137          !                     
    138137         IF( ln_linssh ) THEN    ! top ocean value (only in linear free surface as zwz has been w-masked) 
    139138            IF( ln_isfcav ) THEN             ! top of the ice-shelf cavities and at the ocean surface 
     
    155154                  ztra = - (  zwx(ji,jj,jk) - zwx(ji-1,jj  ,jk  )   & 
    156155                     &      + zwy(ji,jj,jk) - zwy(ji  ,jj-1,jk  )   & 
    157                      &      + zwz(ji,jj,jk) - zwz(ji  ,jj  ,jk+1) ) / ( e1e2t(ji,jj) * e3t_n(ji,jj,jk) ) 
     156                     &      + zwz(ji,jj,jk) - zwz(ji  ,jj  ,jk+1) ) * r1_e1e2t(ji,jj) / e3t_n(ji,jj,jk) 
    158157                  ! update and guess with monotonic sheme 
    159158!!gm why tmask added in the two following lines ???    the mask is done in tranxt ! 
     
    174173         ENDIF 
    175174         ! 
    176          ! 
    177175         !        !==  anti-diffusive flux : high order minus low order  ==! 
    178176         ! 
    179          SELECT CASE( kn_fct_h )         !* horizontal anti-diffusive fluxes 
    180          ! 
    181          CASE(  2  )                         ! 2nd order centered 
     177         SELECT CASE( kn_fct_h )    !* horizontal anti-diffusive fluxes 
     178         ! 
     179         CASE(  2  )                   !- 2nd order centered 
    182180            DO jk = 1, jpkm1 
    183181               DO jj = 1, jpjm1 
     
    189187            END DO 
    190188            ! 
    191          CASE(  4  )                         ! 4th order centered 
    192             zltu(:,:,jpk) = 0._wp                            ! Bottom value : flux set to zero 
     189         CASE(  4  )                   !- 4th order centered 
     190            zltu(:,:,jpk) = 0._wp            ! Bottom value : flux set to zero 
    193191            zltv(:,:,jpk) = 0._wp 
    194             DO jk = 1, jpkm1                                 ! Laplacian 
    195                DO jj = 1, jpjm1                                   ! First derivative (gradient) 
     192            DO jk = 1, jpkm1                 ! Laplacian 
     193               DO jj = 1, jpjm1                    ! 1st derivative (gradient) 
    196194                  DO ji = 1, fs_jpim1   ! vector opt. 
    197195                     ztu(ji,jj,jk) = ( ptn(ji+1,jj  ,jk,jn) - ptn(ji,jj,jk,jn) ) * umask(ji,jj,jk) 
     
    199197                  END DO 
    200198               END DO 
    201                DO jj = 2, jpjm1                                   !  
     199               DO jj = 2, jpjm1                    ! 2nd derivative * 1/ 6 
    202200                  DO ji = fs_2, fs_jpim1   ! vector opt. 
    203201                     zltu(ji,jj,jk) = (  ztu(ji,jj,jk) + ztu(ji-1,jj,jk)  ) * r1_6 
     
    206204               END DO 
    207205            END DO 
    208             ! 
    209206            CALL lbc_lnk( zltu, 'T', 1. )   ;    CALL lbc_lnk( zltv, 'T', 1. )   ! Lateral boundary cond. (unchanged sgn) 
    210207            ! 
    211             DO jk = 1, jpkm1                                 ! Horizontal advective fluxes 
     208            DO jk = 1, jpkm1                 ! Horizontal advective fluxes 
    212209               DO jj = 1, jpjm1 
    213210                  DO ji = 1, fs_jpim1   ! vector opt. 
     
    221218            END DO          
    222219            ! 
    223          CASE(  41 )                         ! 4th order centered       ==>>   !!gm coding attempt   need to be tested 
    224             ztu(:,:,jpk) = 0._wp                             ! Bottom value : flux set to zero 
     220         CASE(  41 )                   !- 4th order centered       ==>>   !!gm coding attempt   need to be tested 
     221            ztu(:,:,jpk) = 0._wp             ! Bottom value : flux set to zero 
    225222            ztv(:,:,jpk) = 0._wp 
    226             DO jk = 1, jpkm1                                 ! gradient 
    227                DO jj = 1, jpjm1                                   ! First derivative (gradient) 
     223            DO jk = 1, jpkm1                 ! 1st derivative (gradient) 
     224               DO jj = 1, jpjm1 
    228225                  DO ji = 1, fs_jpim1   ! vector opt. 
    229226                     ztu(ji,jj,jk) = ( ptn(ji+1,jj  ,jk,jn) - ptn(ji,jj,jk,jn) ) * umask(ji,jj,jk) 
     
    234231            CALL lbc_lnk( ztu, 'U', -1. )   ;    CALL lbc_lnk( ztv, 'V', -1. )   ! Lateral boundary cond. (unchanged sgn) 
    235232            ! 
    236             DO jk = 1, jpkm1                                 ! Horizontal advective fluxes 
     233            DO jk = 1, jpkm1                 ! Horizontal advective fluxes 
    237234               DO jj = 2, jpjm1 
    238235                  DO ji = 2, fs_jpim1   ! vector opt. 
     
    250247            ! 
    251248         END SELECT 
    252          !                                !* vertical anti-diffusive fluxes 
    253          SELECT CASE( kn_fct_v )                ! Interior values (w-masked) 
    254          ! 
    255          CASE(  2  )                                  ! 2nd order centered 
     249         !                       
     250         SELECT CASE( kn_fct_v )    !* vertical anti-diffusive fluxes (w-masked interior values) 
     251         ! 
     252         CASE(  2  )                   !- 2nd order centered 
    256253            DO jk = 2, jpkm1     
    257254               DO jj = 2, jpjm1 
    258255                  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             ! 
     256                     zwz(ji,jj,jk) =  (  pwn(ji,jj,jk) * 0.5_wp * ( ptn(ji,jj,jk,jn) + ptn(ji,jj,jk-1,jn) )   & 
     257                        &              - zwz(ji,jj,jk)  ) * wmask(ji,jj,jk) 
     258                  END DO 
     259               END DO 
     260            END DO 
     261            ! 
     262         CASE(  4  )                   !- 4th order COMPACT 
     263            CALL interp_4th_cpt( ptn(:,:,:,jn) , ztw )   ! zwt = COMPACT interpolation of T at w-point 
    269264            DO jk = 2, jpkm1 
    270265               DO jj = 2, jpjm1 
     
    276271            ! 
    277272         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 
     273         IF( ln_linssh ) THEN    ! top ocean value: high order = upstream  ==>>  zwz=0 
     274            zwz(:,:,1) = 0._wp   ! only ocean surface as interior zwz values have been w-masked 
     275         ENDIF 
    280276         ! 
    281277         CALL lbc_lnk( zwx, 'U', -1. )   ;   CALL lbc_lnk( zwy, 'V', -1. )         ! Lateral bondary conditions 
    282278         CALL lbc_lnk( zwz, 'W',  1. ) 
    283  
     279         ! 
    284280         !        !==  monotonicity algorithm  ==! 
    285281         ! 
    286282         CALL nonosc( ptb(:,:,:,jn), zwx, zwy, zwz, zwi, p2dt ) 
    287  
    288  
     283         ! 
    289284         !        !==  final trend with corrected fluxes  ==! 
    290285         ! 
     
    300295         END DO 
    301296         ! 
    302          IF( l_trd ) THEN                 ! trend diagnostics (contribution of upstream fluxes) 
     297         IF( l_trd ) THEN     ! trend diagnostics (contribution of upstream fluxes) 
    303298            ztrdx(:,:,:) = ztrdx(:,:,:) + zwx(:,:,:)  ! <<< Add to previously computed 
    304299            ztrdy(:,:,:) = ztrdy(:,:,:) + zwy(:,:,:)  ! <<< Add to previously computed 
     
    311306            CALL wrk_dealloc( jpi,jpj,jpk,   ztrdx, ztrdy, ztrdz ) 
    312307         END IF 
    313          !                                 ! "Poleward" heat and salt transports (contribution of upstream fluxes) 
     308         !                    ! "Poleward" heat and salt transports (contribution of upstream fluxes) 
    314309         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(:) 
     310           IF( jn == jp_tem )  htr_adv(:) = htr_adv(:) + ptr_sj( zwy(:,:,:) ) 
     311           IF( jn == jp_sal )  str_adv(:) = str_adv(:) + ptr_sj( zwy(:,:,:) ) 
    317312         ENDIF 
    318313         ! 
    319       END DO 
     314      END DO                     ! end of tracer loop 
    320315      ! 
    321316      CALL wrk_dealloc( jpi,jpj,jpk,    zwi, zwx, zwy, zwz, ztu, ztv, zltu, zltv, ztw ) 
     
    392387      zr_p2dt(:) = 1._wp / p2dt(:) 
    393388      ! 
     389      ! surface & Bottom value : flux set to zero for all tracers 
     390      zwz(:,:, 1 ) = 0._wp 
     391      zwx(:,:,jpk) = 0._wp   ;    zwz(:,:,jpk) = 0._wp 
     392      zwy(:,:,jpk) = 0._wp   ;    zwi(:,:,jpk) = 0._wp 
     393      ! 
    394394      !                                                          ! =========== 
    395395      DO jn = 1, kjpt                                            ! tracer loop 
    396396         !                                                       ! =========== 
    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 
     397         ! 
     398         ! Upstream advection with initial mass fluxes & intermediate update 
     399         DO jk = 1, jpkm1        ! upstream tracer flux in the i and j direction 
    406400            DO jj = 1, jpjm1 
    407401               DO ji = 1, fs_jpim1   ! vector opt. 
     
    416410            END DO 
    417411         END DO 
    418  
    419          ! upstream tracer flux in the k direction 
    420          DO jk = 2, jpkm1         ! Interior value 
     412         !                       ! upstream tracer flux in the k direction 
     413         DO jk = 2, jpkm1              ! Interior value 
    421414            DO jj = 1, jpj 
    422415               DO ji = 1, jpi 
     
    427420            END DO 
    428421         END DO 
    429          !                       ! top value 
    430          IF( .NOT.ln_linssh ) 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 
     422         IF( ln_linssh ) THEN          ! top value : linear free surface case only (as zwz is multiplied by wmask) 
     423            IF( ln_isfcav ) THEN             ! ice-shelf cavities: top value 
    434424               DO jj = 1, jpj 
    435425                  DO ji = 1, jpi 
     
    437427                  END DO 
    438428               END DO    
    439             ELSE                             ! standard case 
     429            ELSE                             ! no cavities, surface value 
    440430               zwz(:,:,1) = pwn(:,:,1) * ptb(:,:,1,jn) 
    441431            ENDIF 
     
    446436            DO jj = 2, jpjm1 
    447437               DO ji = fs_2, fs_jpim1   ! vector opt. 
    448                   ! total intermediate advective trends 
     438                  !                             ! total intermediate advective trends 
    449439                  ztra = - (  zwx(ji,jj,jk) - zwx(ji-1,jj  ,jk  )   & 
    450440                     &      + zwy(ji,jj,jk) - zwy(ji  ,jj-1,jk  )   & 
    451                      &      + zwz(ji,jj,jk) - zwz(ji  ,jj  ,jk+1) ) / ( e1e2t(ji,jj) * e3t_n(ji,jj,jk) ) 
    452                   ! update and guess with monotonic sheme 
     441                     &      + zwz(ji,jj,jk) - zwz(ji  ,jj  ,jk+1)   ) * r1_e1e2t(ji,jj) / e3t_n(ji,jj,jk) 
     442                  !                             ! update and guess with monotonic sheme 
    453443                  pta(ji,jj,jk,jn) =   pta(ji,jj,jk,jn)         + ztra 
    454444                  zwi(ji,jj,jk)    = ( ptb(ji,jj,jk,jn) + z2dtt * ztra ) * tmask(ji,jj,jk) 
     
    497487            END DO 
    498488         END DO 
    499        
     489         ! 
    500490         !                                !* vertical anti-diffusive flux 
    501491         zwz_sav(:,:,:)   = zwz(:,:,:) 
    502492         ztrs   (:,:,:,1) = ptb(:,:,:,jn) 
    503493         zwzts  (:,:,:)   = 0._wp 
    504          IF( .NOT.ln_linssh )   zwz(:,:, 1 ) = 0._wp    ! surface value set to zero in vvl case 
    505494         ! 
    506495         DO jl = 1, kn_fct_zts                  ! Start of sub timestepping loop 
     
    535524                     END DO 
    536525                  END DO    
    537                ELSE                                      ! standard case 
     526               ELSE                                      ! no ocean cavities 
    538527                  zwz(:,:,1) = pwn(:,:,1) * ptb(:,:,1,jn) 
    539528               ENDIF 
Note: See TracChangeset for help on using the changeset viewer.