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 7351 for branches/2016/dev_INGV_UKMO_2016/NEMOGCM/NEMO/OPA_SRC/TRA/traadv_qck.F90 – NEMO

Ignore:
Timestamp:
2016-11-28T17:04:10+01:00 (7 years ago)
Author:
emanuelaclementi
Message:

ticket #1805 step 3: /2016/dev_INGV_UKMO_2016 aligned to the trunk at revision 7161

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/2016/dev_INGV_UKMO_2016/NEMOGCM/NEMO/OPA_SRC/TRA/traadv_qck.F90

    r5930 r7351  
    3838 
    3939   !! * Substitutions 
    40 #  include "domzgr_substitute.h90" 
    4140#  include "vectopt_loop_substitute.h90" 
    4241   !!---------------------------------------------------------------------- 
     
    7877      !!            prevent the appearance of spurious numerical oscillations 
    7978      !! 
    80       !! ** Action : - update (pta) with the now advective tracer trends 
    81       !!             - save the trends  
     79      !! ** Action : - update pta  with the now advective tracer trends 
     80      !!             - send trends to trdtra module for further diagnostcs (l_trdtra=T) 
     81      !!             - htr_adv, str_adv : poleward advective heat and salt transport (ln_diaptr=T) 
    8282      !! 
    8383      !! ** Reference : Leonard (1979, 1991) 
     
    8787      CHARACTER(len=3)                     , INTENT(in   ) ::   cdtype          ! =TRA or TRC (tracer indicator) 
    8888      INTEGER                              , INTENT(in   ) ::   kjpt            ! number of tracers 
    89       REAL(wp), DIMENSION(        jpk     ), INTENT(in   ) ::   p2dt            ! vertical profile of tracer time-step 
     89      REAL(wp)                             , INTENT(in   ) ::   p2dt            ! tracer time-step 
    9090      REAL(wp), DIMENSION(jpi,jpj,jpk     ), INTENT(in   ) ::   pun, pvn, pwn   ! 3 ocean velocity components 
    9191      REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(in   ) ::   ptb, ptn        ! before and now tracer fields 
     
    105105      IF( ( cdtype == 'TRA' .AND. l_trdtra ) .OR. ( cdtype == 'TRC' .AND. l_trdtrc ) )   l_trd = .TRUE. 
    106106      ! 
    107       ! I. The horizontal fluxes are computed with the QUICKEST + ULTIMATE scheme 
     107      !        ! horizontal fluxes are computed with the QUICKEST + ULTIMATE scheme 
    108108      CALL tra_adv_qck_i( kt, cdtype, p2dt, pun, ptb, ptn, pta, kjpt )  
    109109      CALL tra_adv_qck_j( kt, cdtype, p2dt, pvn, ptb, ptn, pta, kjpt )  
    110110 
    111       ! II. The vertical fluxes are computed with the 2nd order centered scheme 
     111      !        ! vertical fluxes are computed with the 2nd order centered scheme 
    112112      CALL tra_adv_cen2_k( kt, cdtype, pwn,         ptn, pta, kjpt ) 
    113113      ! 
     
    125125      CHARACTER(len=3)                     , INTENT(in   ) ::   cdtype     ! =TRA or TRC (tracer indicator) 
    126126      INTEGER                              , INTENT(in   ) ::   kjpt       ! number of tracers 
    127       REAL(wp), DIMENSION(        jpk     ), INTENT(in   ) ::   p2dt       ! vertical profile of tracer time-step 
     127      REAL(wp)                             , INTENT(in   ) ::   p2dt       ! tracer time-step 
    128128      REAL(wp), DIMENSION(jpi,jpj,jpk     ), INTENT(in   ) ::   pun        ! i-velocity components 
    129129      REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(in   ) ::   ptb, ptn   ! before and now tracer fields 
     
    131131      !! 
    132132      INTEGER  ::   ji, jj, jk, jn   ! dummy loop indices 
    133       REAL(wp) ::   ztra, zbtr, zdir, zdx, zdt, zmsk   ! local scalars 
     133      REAL(wp) ::   ztra, zbtr, zdir, zdx, zmsk   ! local scalars 
    134134      REAL(wp), POINTER, DIMENSION(:,:,:) ::   zwx, zfu, zfc, zfd 
    135135      !---------------------------------------------------------------------- 
     
    166166         ! 
    167167         DO jk = 1, jpkm1   
    168             zdt =  p2dt(jk) 
    169168            DO jj = 2, jpjm1 
    170169               DO ji = fs_2, fs_jpim1   ! vector opt.    
    171170                  zdir = 0.5 + SIGN( 0.5, pun(ji,jj,jk) )   ! if pun > 0 : zdir = 1 otherwise zdir = 0  
    172                   zdx = ( zdir * e1t(ji,jj) + ( 1. - zdir ) * e1t(ji+1,jj) ) * e2u(ji,jj) * fse3u(ji,jj,jk) 
    173                   zwx(ji,jj,jk)  = ABS( pun(ji,jj,jk) ) * zdt / zdx    ! (0<zc_cfl<1 : Courant number on x-direction) 
     171                  zdx = ( zdir * e1t(ji,jj) + ( 1. - zdir ) * e1t(ji+1,jj) ) * e2u(ji,jj) * e3u_n(ji,jj,jk) 
     172                  zwx(ji,jj,jk)  = ABS( pun(ji,jj,jk) ) * p2dt / zdx    ! (0<zc_cfl<1 : Courant number on x-direction) 
    174173                  zfc(ji,jj,jk)  = zdir * ptb(ji  ,jj,jk,jn) + ( 1. - zdir ) * ptb(ji+1,jj,jk,jn)  ! FC in the x-direction for T 
    175174                  zfd(ji,jj,jk)  = zdir * ptb(ji+1,jj,jk,jn) + ( 1. - zdir ) * ptb(ji  ,jj,jk,jn)  ! FD in the x-direction for T 
     
    216215            DO jj = 2, jpjm1 
    217216               DO ji = fs_2, fs_jpim1   ! vector opt.   
    218                   zbtr = 1. / ( e1e2t(ji,jj) * fse3t(ji,jj,jk) ) 
     217                  zbtr = r1_e1e2t(ji,jj) / e3t_n(ji,jj,jk) 
    219218                  ! horizontal advective trends 
    220219                  ztra = - zbtr * ( zwx(ji,jj,jk) - zwx(ji-1,jj,jk) ) 
     
    224223            END DO 
    225224         END DO 
    226          !                                 ! trend diagnostics (contribution of upstream fluxes) 
     225         !                                 ! trend diagnostics 
    227226         IF( l_trd )   CALL trd_tra( kt, cdtype, jn, jptra_xad, zwx, pun, ptn(:,:,:,jn) ) 
    228227         ! 
     
    242241      CHARACTER(len=3)                     , INTENT(in   ) ::   cdtype     ! =TRA or TRC (tracer indicator) 
    243242      INTEGER                              , INTENT(in   ) ::   kjpt       ! number of tracers 
    244       REAL(wp), DIMENSION(        jpk     ), INTENT(in   ) ::   p2dt       ! vertical profile of tracer time-step 
     243      REAL(wp)                             , INTENT(in   ) ::   p2dt       ! tracer time-step 
    245244      REAL(wp), DIMENSION(jpi,jpj,jpk     ), INTENT(in   ) ::   pvn        ! j-velocity components 
    246245      REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(in   ) ::   ptb, ptn   ! before and now tracer fields 
     
    248247      !! 
    249248      INTEGER  :: ji, jj, jk, jn   ! dummy loop indices 
    250       REAL(wp) :: ztra, zbtr, zdir, zdx, zdt, zmsk   ! local scalars 
     249      REAL(wp) :: ztra, zbtr, zdir, zdx, zmsk   ! local scalars 
    251250      REAL(wp), POINTER, DIMENSION(:,:,:) :: zwy, zfu, zfc, zfd 
    252251      !---------------------------------------------------------------------- 
     
    289288         ! 
    290289         DO jk = 1, jpkm1   
    291             zdt =  p2dt(jk) 
    292290            DO jj = 2, jpjm1 
    293291               DO ji = fs_2, fs_jpim1   ! vector opt.    
    294292                  zdir = 0.5 + SIGN( 0.5, pvn(ji,jj,jk) )   ! if pun > 0 : zdir = 1 otherwise zdir = 0  
    295                   zdx = ( zdir * e2t(ji,jj) + ( 1. - zdir ) * e2t(ji,jj+1) ) * e1v(ji,jj) * fse3v(ji,jj,jk) 
    296                   zwy(ji,jj,jk)  = ABS( pvn(ji,jj,jk) ) * zdt / zdx    ! (0<zc_cfl<1 : Courant number on x-direction) 
     293                  zdx = ( zdir * e2t(ji,jj) + ( 1. - zdir ) * e2t(ji,jj+1) ) * e1v(ji,jj) * e3v_n(ji,jj,jk) 
     294                  zwy(ji,jj,jk)  = ABS( pvn(ji,jj,jk) ) * p2dt / zdx    ! (0<zc_cfl<1 : Courant number on x-direction) 
    297295                  zfc(ji,jj,jk)  = zdir * ptb(ji,jj  ,jk,jn) + ( 1. - zdir ) * ptb(ji,jj+1,jk,jn)  ! FC in the x-direction for T 
    298296                  zfd(ji,jj,jk)  = zdir * ptb(ji,jj+1,jk,jn) + ( 1. - zdir ) * ptb(ji,jj  ,jk,jn)  ! FD in the x-direction for T 
     
    340338            DO jj = 2, jpjm1 
    341339               DO ji = fs_2, fs_jpim1   ! vector opt.   
    342                   zbtr = 1. / ( e1e2t(ji,jj) * fse3t(ji,jj,jk) ) 
     340                  zbtr = r1_e1e2t(ji,jj) / e3t_n(ji,jj,jk) 
    343341                  ! horizontal advective trends 
    344342                  ztra = - zbtr * ( zwy(ji,jj,jk) - zwy(ji,jj-1,jk) ) 
     
    348346            END DO 
    349347         END DO 
    350          !                                 ! trend diagnostics (contribution of upstream fluxes) 
     348         !                                 ! trend diagnostics 
    351349         IF( l_trd )   CALL trd_tra( kt, cdtype, jn, jptra_yad, zwy, pvn, ptn(:,:,:,jn) ) 
    352350         !                                 ! "Poleward" heat and salt transports (contribution of upstream fluxes) 
     
    381379      CALL wrk_alloc( jpi,jpj,jpk,   zwz ) 
    382380      ! 
    383       !                          ! surface & bottom values  
    384       IF( lk_vvl )   zwz(:,:, 1 ) = 0._wp             ! set to zero one for all 
    385                      zwz(:,:,jpk) = 0._wp             ! except at the surface in linear free surface 
     381      zwz(:,:, 1 ) = 0._wp       ! surface & bottom values set to zero for all tracers 
     382      zwz(:,:,jpk) = 0._wp 
    386383      ! 
    387384      !                                                          ! =========== 
     
    396393            END DO 
    397394         END DO 
    398          IF(.NOT.lk_vvl ) THEN               !* top value   (only in linear free surf. as zwz is multiplied by wmask) 
     395         IF( ln_linssh ) THEN                !* top value   (only in linear free surf. as zwz is multiplied by wmask) 
    399396            IF( ln_isfcav ) THEN                  ! ice-shelf cavities (top of the ocean) 
    400397               DO jj = 1, jpj 
     
    403400                  END DO 
    404401               END DO    
    405             ELSE                                   ! no ice-shelf cavities (only ocean surface) 
     402            ELSE                                   ! no ocean cavities (only ocean surface) 
    406403               zwz(:,:,1) = pwn(:,:,1) * ptn(:,:,1,jn) 
    407404            ENDIF 
     
    412409               DO ji = fs_2, fs_jpim1   ! vector opt. 
    413410                  pta(ji,jj,jk,jn) = pta(ji,jj,jk,jn) - ( zwz(ji,jj,jk) - zwz(ji,jj,jk+1) )   & 
    414                      &                                / ( e1e2t(ji,jj) * fse3t(ji,jj,jk) ) 
    415                END DO 
    416             END DO 
    417          END DO 
    418          !                                 ! Save the vertical advective trends for diagnostic 
     411                     &                                * r1_e1e2t(ji,jj) / e3t_n(ji,jj,jk) 
     412               END DO 
     413            END DO 
     414         END DO 
     415         !                                 ! Send trends for diagnostic 
    419416         IF( l_trd )  CALL trd_tra( kt, cdtype, jn, jptra_zad, zwz, pwn, ptn(:,:,:,jn) ) 
    420417         ! 
    421418      END DO 
    422419      ! 
    423       CALL wrk_dealloc( jpi, jpj, jpk, zwz ) 
     420      CALL wrk_dealloc( jpi,jpj,jpk,  zwz ) 
    424421      ! 
    425422   END SUBROUTINE tra_adv_cen2_k 
Note: See TracChangeset for help on using the changeset viewer.