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 1708 for trunk/NEMO/OPA_SRC/DYN/dynspg_ts.F90 – NEMO

Ignore:
Timestamp:
2009-11-04T14:24:34+01:00 (14 years ago)
Author:
rblod
Message:

Stability for explicit bottom friction, see ticket #588

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/NEMO/OPA_SRC/DYN/dynspg_ts.F90

    r1694 r1708  
    9494      INTEGER  ::   ji, jj, jk, jn   ! dummy loop indices 
    9595      INTEGER  ::   icycle           ! temporary scalar 
     96      INTEGER  ::   ikbu, ikbv        ! temporary scalar 
    9697 
    9798      REAL(wp) ::   zraur, zcoef, z2dt_e, z2dt_b     ! temporary scalars 
     
    102103      !! 
    103104      REAL(wp), DIMENSION(jpi,jpj) ::   zhdiv, zsshb_e 
     105      !! 
     106      REAL(wp), DIMENSION(jpi,jpj) ::   zbfru  , zbfrv     ! 2D workspace 
    104107      !! 
    105108      REAL(wp), DIMENSION(jpi,jpj) ::   zsshun_e, zsshvn_e   ! 2D workspace 
     
    119122         IF(lwp) WRITE(numout,*) ' Number of sub cycle in 1 time-step (2 rdt) : icycle = ',  2*nn_baro 
    120123         ! 
    121          CALL ts_rst( nit000, 'READ' )   ! read or initialize the following fields: 
    122          !                               ! un_b, vn_b   
     124         CALL ts_rst( nit000, 'READ' )   ! read or initialize the following fields: un_b, vn_b   
    123125         ! 
    124126         ua_e  (:,:) = un_b (:,:) 
     
    131133            ftne(1,:) = 0.e0   ;   ftnw(1,:) = 0.e0   ;   ftse(1,:) = 0.e0   ;   ftsw(1,:) = 0.e0 
    132134            DO jj = 2, jpj 
    133                DO ji = 2, jpi   ! NO vector opt. 
     135               DO ji = fs_2, jpi   ! vector opt. 
    134136                  ftne(ji,jj) = ( ff(ji-1,jj  ) + ff(ji  ,jj  ) + ff(ji  ,jj-1) ) / 3. 
    135137                  ftnw(ji,jj) = ( ff(ji-1,jj-1) + ff(ji-1,jj  ) + ff(ji  ,jj  ) ) / 3. 
     
    252254      END DO 
    253255 
    254       !                                            ! Remove barotropic contribution of bottom friction  
    255                                                    ! from the barotropic transport trend 
     256                     
     257      !                                             ! Remove barotropic contribution of bottom friction  
     258      !                                             ! from the barotropic transport trend 
     259      zcoef = -1. / z2dt_b 
     260# if defined key_vectopt_loop 
     261      DO jj = 1, 1 
     262         DO ji = jpi+2, jpij-jpi-1   ! vector opt. (forced unrolling) 
     263# else 
     264      DO jj = 2, jpjm1 
     265         DO ji = 2, jpim1 
     266# endif 
     267            ikbu = MIN( mbathy(ji+1,jj), mbathy(ji,jj) ) 
     268            ikbv = MIN( mbathy(ji,jj+1), mbathy(ji,jj) ) 
     269            ! 
     270            ! Apply stability criteria for bottom friction 
     271            !RBbug for vvl and external mode we may need to 
     272            ! use varying fse3 
     273            zbfru  (ji,jj) = MAX( bfrua(ji,jj), fse3u(ji,jj,ikbu)*zcoef ) 
     274            zbfrv  (ji,jj) = MAX( bfrva(ji,jj), fse3v(ji,jj,ikbv)*zcoef ) 
     275         END DO 
     276      END DO 
     277 
    256278      IF( lk_vvl ) THEN 
    257        DO jj = 2, jpjm1 
    258           DO ji = fs_2, fs_jpim1   ! vector opt. 
    259              zua(ji,jj) = zua(ji,jj) - bfrua(ji,jj) * zub(ji,jj) / ( hu_0(ji,jj) + sshu_b(ji,jj) + 1.e0 - umask(ji,jj,1) ) 
    260              zva(ji,jj) = zva(ji,jj) - bfrva(ji,jj) * zvb(ji,jj) / ( hv_0(ji,jj) + sshv_b(ji,jj) + 1.e0 - vmask(ji,jj,1) ) 
    261           END DO 
    262        END DO 
     279         DO jj = 2, jpjm1 
     280            DO ji = fs_2, fs_jpim1   ! vector opt. 
     281               zua(ji,jj) = zua(ji,jj) - zbfru(ji,jj) * zub(ji,jj)   & 
     282                  &       / ( hu_0(ji,jj) + sshu_b(ji,jj) + 1.e0 - umask(ji,jj,1) ) 
     283               zva(ji,jj) = zva(ji,jj) - zbfrv(ji,jj) * zvb(ji,jj)   & 
     284                  &       / ( hv_0(ji,jj) + sshv_b(ji,jj) + 1.e0 - vmask(ji,jj,1) ) 
     285            END DO 
     286         END DO 
    263287      ELSE 
    264        DO jj = 2, jpjm1 
    265           DO ji = fs_2, fs_jpim1   ! vector opt. 
    266              zua(ji,jj) = zua(ji,jj) - bfrua(ji,jj) * zub(ji,jj) * hur(ji,jj) 
    267              zva(ji,jj) = zva(ji,jj) - bfrva(ji,jj) * zvb(ji,jj) * hvr(ji,jj) 
    268           END DO 
    269        END DO 
     288         DO jj = 2, jpjm1 
     289            DO ji = fs_2, fs_jpim1   ! vector opt. 
     290               zua(ji,jj) = zua(ji,jj) - zbfru(ji,jj) * zub(ji,jj) * hur(ji,jj) 
     291               zva(ji,jj) = zva(ji,jj) - zbfrv(ji,jj) * zvb(ji,jj) * hvr(ji,jj) 
     292            END DO 
     293         END DO 
    270294      ENDIF 
    271295 
Note: See TracChangeset for help on using the changeset viewer.