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 791 for branches/dev_001_GM/NEMO/OPA_SRC/TRA/traadv_muscl2.F90 – NEMO

Ignore:
Timestamp:
2008-01-12T21:33:34+01:00 (16 years ago)
Author:
gm
Message:

dev_001_GM - TRA/traadv : switch from velocity to transport + optimised traadv_eiv2 introduced - compilation OK

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/dev_001_GM/NEMO/OPA_SRC/TRA/traadv_muscl2.F90

    r786 r791  
    44   !! Ocean active tracers:  horizontal & vertical advective trend 
    55   !!============================================================================== 
    6    !! History :  1.0  !  02-06  (G. Madec) from traadv_muscl 
    7    !!            2.4  !  08-01  (G. Madec) Merge TRA-TRC 
     6   !! History :  1.0  !  2002-06  (G. Madec) from traadv_muscl 
     7   !!            2.4  !  2008-01  (G. Madec)  merge TRC-TRA + switch from velocity to transport 
    88   !!---------------------------------------------------------------------- 
    99 
     
    2626   PRIVATE 
    2727 
    28    !! * Accessibility 
    2928   PUBLIC tra_adv_muscl2        ! routine called by step.F90 
    3029 
     
    3433   !!---------------------------------------------------------------------- 
    3534   !! NEMO/OPA 2.4 , LOCEAN-IPSL (2008)  
    36    !! $Id:$  
     35   !! $Id$  
    3736   !! Software governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt) 
    3837   !!---------------------------------------------------------------------- 
     
    6665      !! 
    6766      INTEGER  ::   ji, jj, jk   ! dummy loop indices 
    68       REAL(wp) ::   zu, zv, zw, zeu, zev 
    69       REAL(wp) ::   zew, zbtr, zstep, z2  
     67      REAL(wp) ::   zu, zv, zw 
     68      REAL(wp) ::   zbtr, zstep, z2  
    7069      REAL(wp) ::   z0u, z0v, z0w 
    71       REAL(wp) ::   zzwx, zzwy, zalpha, zta 
     70      REAL(wp) ::   zzwx, zzwy, zalpha 
    7271      REAL(wp), DIMENSION (jpi,jpj,jpk) ::   zwx, zwy, zslpx, zslpy   ! 3D workspace 
    7372      !!---------------------------------------------------------------------- 
     
    9897      zwx(:,:,jpk) = 0.e0    ;    zwy(:,:,jpk) = 0.e0        ! bottom values 
    9998 
     99!!gm  this lbc_lnk can be omitted 
    100100      ! lateral boundary conditions on zwx, zwy   (changed sign) 
    101101      CALL lbc_lnk( zwx, 'U', -1. )   ;   CALL lbc_lnk( zwy, 'V', -1. ) 
     
    117117         DO jj = 2, jpj 
    118118            DO ji = fs_2, jpi   ! vector opt. 
    119                zslpx(ji,jj,jk) = SIGN( 1., zslpx(ji,jj,jk) )   & 
    120                   &            * MIN(    ABS( zslpx(ji  ,jj,jk) ),   & 
    121                   &                   2.*ABS( zwx (ji-1,jj,jk) ),   & 
    122                   &                   2.*ABS( zwx (ji  ,jj,jk) ) ) 
    123                zslpy(ji,jj,jk) = SIGN( 1., zslpy(ji,jj,jk) )   & 
    124                   &            * MIN(    ABS( zslpy(ji,jj  ,jk) ),   & 
    125                   &                   2.*ABS( zwy (ji,jj-1,jk) ),   & 
    126                   &                   2.*ABS( zwy (ji,jj  ,jk) ) ) 
     119               zslpx(ji,jj,jk) = SIGN( 1., zslpx(ji,jj,jk) ) * MIN(    ABS( zslpx(ji  ,jj,jk) ),   & 
     120                  &                                                 2.*ABS( zwx  (ji-1,jj,jk) ),   & 
     121                  &                                                 2.*ABS( zwx  (ji  ,jj,jk) ) ) 
     122               zslpy(ji,jj,jk) = SIGN( 1., zslpy(ji,jj,jk) ) * MIN(    ABS( zslpy(ji,jj  ,jk) ),   & 
     123                  &                                                 2.*ABS( zwy  (ji,jj-1,jk) ),   & 
     124                  &                                                 2.*ABS( zwy  (ji,jj  ,jk) ) ) 
    127125            END DO 
    128126         END DO 
     
    134132         DO jj = 2, jpjm1       
    135133            DO ji = fs_2, fs_jpim1   ! vector opt. 
    136                ! volume fluxes 
    137 #if defined key_zco 
    138                zeu = e2u(ji,jj)                   * pun(ji,jj,jk) 
    139                zev = e1v(ji,jj)                   * pvn(ji,jj,jk) 
    140 #else 
    141                zeu = e2u(ji,jj) * fse3u(ji,jj,jk) * pun(ji,jj,jk) 
    142                zev = e1v(ji,jj) * fse3v(ji,jj,jk) * pvn(ji,jj,jk) 
    143 #endif 
    144                ! MUSCL fluxes 
    145                z0u = SIGN( 0.5, pun(ji,jj,jk) )             
     134               z0u  = SIGN( 0.5, pun(ji,jj,jk) )             
    146135               zalpha = 0.5 - z0u 
    147                zu  = z0u - 0.5 * pun(ji,jj,jk) * zstep / e1u(ji,jj) 
    148                zzwx = ptb(ji+1,jj,jk) + zu*zslpx(ji+1,jj,jk) 
    149                zzwy = ptb(ji  ,jj,jk) + zu*zslpx(ji  ,jj,jk) 
    150                zwx(ji,jj,jk) = zeu * ( zalpha * zzwx + (1.-zalpha) * zzwy ) 
     136               zu   = z0u - 0.5 * pun(ji,jj,jk) * zstep / ( e1u(ji,jj) * e2u(ji,jj) * fse3u(ji,jj,jk) ) 
     137               zzwx = ptb(ji+1,jj,jk) + zu * zslpx(ji+1,jj,jk) 
     138               zzwy = ptb(ji  ,jj,jk) + zu * zslpx(ji  ,jj,jk) 
     139               zwx(ji,jj,jk) = pun(ji,jj,jk) * ( zalpha * zzwx + (1.-zalpha) * zzwy ) 
    151140               ! 
    152141               z0v = SIGN( 0.5, pvn(ji,jj,jk) )             
    153142               zalpha = 0.5 - z0v 
    154                zv  = z0v - 0.5 * pvn(ji,jj,jk) * zstep / e2v(ji,jj) 
    155                zzwx = ptb(ji,jj+1,jk) + zv*zslpy(ji,jj+1,jk) 
    156                zzwy = ptb(ji,jj  ,jk) + zv*zslpy(ji,jj  ,jk) 
    157                zwy(ji,jj,jk) = zev * ( zalpha * zzwx + (1.-zalpha) * zzwy ) 
     143               zv   = z0v - 0.5 * pvn(ji,jj,jk) * zstep / ( e1v(ji,jj) * e2v(ji,jj) * fse3v(ji,jj,jk) ) 
     144               zzwx = ptb(ji,jj+1,jk) + zv * zslpy(ji,jj+1,jk) 
     145               zzwy = ptb(ji,jj  ,jk) + zv * zslpy(ji,jj  ,jk) 
     146               zwy(ji,jj,jk) = pvn(ji,jj,jk) * ( zalpha * zzwx + (1.-zalpha) * zzwy ) 
    158147            END DO 
    159148         END DO 
     
    166155        DO jj = 2, jpjm1 
    167156            DO ji = fs_2, fs_jpim1   ! vector opt. 
    168 #if defined key_zco 
    169157               IF( umask(ji,jj,jk) == 0. ) THEN 
    170158                  IF( pun(ji+1,jj,jk) > 0. .AND. ji /= jpi ) THEN 
    171                      zwx(ji+1,jj,jk) = e2u(ji+1,jj) * pun(ji+1,jj,jk) * ( ptn(ji+1,jj,jk) + ptn(ji+2,jj,jk) ) * 0.5 
     159                     zwx(ji+1,jj,jk) = pun(ji+1,jj,jk) * ( ptn(ji+1,jj,jk) + ptn(ji+2,jj,jk) ) * 0.5 
    172160                  ENDIF 
    173161                  IF( pun(ji-1,jj,jk) < 0. ) THEN 
    174                      zwx(ji-1,jj,jk) = e2u(ji-1,jj) * pun(ji-1,jj,jk) * ( ptn(ji-1,jj,jk) + ptn(ji  ,jj,jk) ) * 0.5 
     162                     zwx(ji-1,jj,jk) = pun(ji-1,jj,jk) * ( ptn(ji-1,jj,jk) + ptn(ji  ,jj,jk) ) * 0.5 
    175163                  ENDIF 
    176164               ENDIF 
    177165               IF( vmask(ji,jj,jk) == 0. ) THEN 
    178166                  IF( pvn(ji,jj+1,jk) > 0. .AND. jj /= jpj ) THEN 
    179                      zwy(ji,jj+1,jk) = e1v(ji,jj+1) * pvn(ji,jj+1,jk) * ( ptn(ji,jj+1,jk) + ptn(ji,jj+2,jk) ) * 0.5 
     167                     zwy(ji,jj+1,jk) = pvn(ji,jj+1,jk) * ( ptn(ji,jj+1,jk) + ptn(ji,jj+2,jk) ) * 0.5 
    180168                  ENDIF 
    181169                  IF( pvn(ji,jj-1,jk) < 0. ) THEN 
    182                      zwy(ji,jj-1,jk) = e1v(ji,jj-1) * pvn(ji,jj-1,jk) * ( ptn(ji,jj-1,jk) + ptn(ji  ,jj,jk) ) * 0.5 
     170                     zwy(ji,jj-1,jk) = pvn(ji,jj-1,jk) * ( ptn(ji,jj-1,jk) + ptn(ji  ,jj,jk) ) * 0.5 
    183171                  ENDIF 
    184172               ENDIF 
    185 #else 
    186                IF( umask(ji,jj,jk) == 0. ) THEN 
    187                   IF( pun(ji+1,jj,jk) > 0. .AND. ji /= jpi ) THEN 
    188                      zwx(ji+1,jj,jk) = e2u(ji+1,jj)* fse3u(ji+1,jj,jk)   & 
    189                         &            * pun(ji+1,jj,jk) * ( ptn(ji+1,jj,jk) + ptn(ji+2,jj,jk) ) * 0.5 
    190                   ENDIF 
    191                   IF( pun(ji-1,jj,jk) < 0. ) THEN 
    192                      zwx(ji-1,jj,jk) = e2u(ji-1,jj)* fse3u(ji-1,jj,jk)   & 
    193                         &            * pun(ji-1,jj,jk) * ( ptn(ji-1,jj,jk) + ptn(ji  ,jj,jk) ) * 0.5 
    194                   ENDIF 
    195                ENDIF 
    196                IF( vmask(ji,jj,jk) == 0. ) THEN 
    197                   IF( pvn(ji,jj+1,jk) > 0. .AND. jj /= jpj ) THEN 
    198                      zwy(ji,jj+1,jk) = e1v(ji,jj+1) * fse3v(ji,jj+1,jk)   & 
    199                         &            * pvn(ji,jj+1,jk) * ( ptn(ji,jj+1,jk) + ptn(ji,jj+2,jk) ) * 0.5 
    200                   ENDIF 
    201                   IF( pvn(ji,jj-1,jk) < 0. ) THEN 
    202                      zwy(ji,jj-1,jk) = e1v(ji,jj-1)* fse3v(ji,jj-1,jk)   & 
    203                         &            * pvn(ji,jj-1,jk) * ( ptn(ji,jj-1,jk) + ptn(ji  ,jj,jk) ) * 0.5 
    204                   ENDIF 
    205                ENDIF 
    206 #endif 
    207173            END DO 
    208174         END DO 
     
    217183         DO jj = 2, jpjm1       
    218184            DO ji = fs_2, fs_jpim1   ! vector opt. 
    219 #if defined key_zco 
    220                zbtr = 1. / ( e1t(ji,jj)*e2t(ji,jj) ) 
    221 #else 
    222185               zbtr = 1. / ( e1t(ji,jj)*e2t(ji,jj)*fse3t(ji,jj,jk) ) 
    223 #endif 
    224                ! horizontal advective trends 
    225                zta = - zbtr * ( zwx(ji,jj,jk) - zwx(ji-1,jj  ,jk  )   & 
    226                   &           + zwy(ji,jj,jk) - zwy(ji  ,jj-1,jk  ) )  
    227                ! add it to the general tracer trends 
    228                pta(ji,jj,jk) = pta(ji,jj,jk) + zta 
     186               ! horizontal advective trends added to the general tracer trends 
     187               pta(ji,jj,jk) = pta(ji,jj,jk) - zbtr * ( zwx(ji,jj,jk) - zwx(ji-1,jj  ,jk  )   & 
     188                  &                                   + zwy(ji,jj,jk) - zwy(ji  ,jj-1,jk  ) )  
    229189            END DO 
    230190        END DO 
     
    270230            DO ji = 1, jpi 
    271231               zslpx(ji,jj,jk) =                    ( zwx(ji,jj,jk) + zwx(ji,jj,jk+1) )   & 
    272                   &           * ( 0.25 + SIGN( 0.25, zwx(ji,jj,jk) * zwx(ji,jj,jk+1) ) ) 
     232                  &            * ( 0.25 + SIGN( 0.25, zwx(ji,jj,jk) * zwx(ji,jj,jk+1) ) ) 
    273233            END DO 
    274234         END DO 
     
    279239         DO jj = 1, jpj 
    280240            DO ji = 1, jpi 
    281                zslpx(ji,jj,jk) = SIGN( 1., zslpx(ji,jj,jk) )   & 
    282                   &           * MIN(    ABS( zslpx(ji,jj,jk  ) ),   & 
    283                   &                  2.*ABS( zwx (ji,jj,jk+1) ),   & 
    284                   &                  2.*ABS( zwx (ji,jj,jk  ) ) ) 
     241               zslpx(ji,jj,jk) = SIGN( 1., zslpx(ji,jj,jk) ) * MIN(    ABS( zslpx(ji,jj,jk  ) ),   & 
     242                  &                                                 2.*ABS( zwx  (ji,jj,jk+1) ),   & 
     243                  &                                                 2.*ABS( zwx  (ji,jj,jk  ) ) ) 
    285244            END DO 
    286245         END DO 
     
    293252         DO jj = 2, jpjm1       
    294253            DO ji = fs_2, fs_jpim1   ! vector opt. 
    295                zew = pwn(ji,jj,jk+1) 
    296254               z0w = SIGN( 0.5, pwn(ji,jj,jk+1) ) 
    297255               zalpha = 0.5 + z0w 
    298                zw  = z0w - 0.5 * pwn(ji,jj,jk+1)*zstep / fse3w(ji,jj,jk+1) 
    299                zzwx = ptb(ji,jj,jk+1) + zw*zslpx(ji,jj,jk+1) 
    300                zzwy = ptb(ji,jj,jk  ) + zw*zslpx(ji,jj,jk  ) 
    301                zwx(ji,jj,jk+1) = zew * ( zalpha * zzwx + (1.-zalpha)*zzwy ) 
     256               zw  = z0w - 0.5 * pwn(ji,jj,jk+1)*zstep / ( e1t(ji,jj) *e2t(ji,jj) * fse3w(ji,jj,jk+1) ) 
     257               zzwx = ptb(ji,jj,jk+1) + zw * zslpx(ji,jj,jk+1) 
     258               zzwy = ptb(ji,jj,jk  ) + zw * zslpx(ji,jj,jk  ) 
     259               zwx(ji,jj,jk+1) = pwn(ji,jj,jk+1) * ( zalpha * zzwx + (1.-zalpha)*zzwy ) 
    302260            END DO 
    303261         END DO 
     
    315273      END DO 
    316274 
    317       ! surface values 
    318       IF( lk_dynspg_rl .OR. lk_vvl ) THEN              ! rigid lid or variable volume: flux set to zero 
    319          zwx(:,:, 1 ) = 0.e0                                 ! surface 
    320          zwx(:,:,jpk) = 0.e0                                 ! bottom  
    321       ELSE                                             ! free surface 
    322          zwx(:,:, 1 ) = pwn(:,:,1) * ptb(:,:,1)               ! surface 
    323          zwx(:,:,jpk) = 0.e0                                 ! bottom  
    324       ENDIF 
     275      zwx(:,:,jpk) = 0.e0                                       ! bottom value 
     276      !                                                         ! surface values 
     277      IF( lk_dynspg_rl .OR. lk_vvl) THEN    ;   zwx(:,:, 1 ) = 0.e0                      ! rigid lid or variable volume 
     278      ELSE                                  ;   zwx(:,:, 1 ) = pwn(:,:,1) * ptb(:,:,1)   ! linear free surface 
     279      ENDIF  
    325280 
    326281 
     
    330285            DO ji = fs_2, fs_jpim1   ! vector opt. 
    331286               zbtr = 1. / fse3t(ji,jj,jk) 
    332                ! horizontal advective trends 
    333                zta = - zbtr * ( zwx(ji,jj,jk) - zwx(ji,jj,jk+1) ) 
    334                ! add it to the general tracer trends 
    335                pta(ji,jj,jk) =  pta(ji,jj,jk) + zta 
     287               ! horizontal advective trends added to the general tracer trends 
     288               pta(ji,jj,jk) =  pta(ji,jj,jk) - zbtr * ( zwx(ji,jj,jk) - zwx(ji,jj,jk+1) ) 
    336289            END DO 
    337290         END DO 
Note: See TracChangeset for help on using the changeset viewer.