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 11080 for branches/UKMO/r8395_India_uncoupled/NEMOGCM/NEMO/OPA_SRC/DYN/dynnxt.F90 – NEMO

Ignore:
Timestamp:
2019-06-06T15:32:24+02:00 (5 years ago)
Author:
jcastill
Message:

Latest changes from Jason

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/UKMO/r8395_India_uncoupled/NEMOGCM/NEMO/OPA_SRC/DYN/dynnxt.F90

    r10684 r11080  
    3131   USE dynadv         ! dynamics: vector invariant versus flux form 
    3232   USE dynspg_ts      ! surface pressure gradient: split-explicit scheme 
     33   USE dynspg 
    3334   USE domvvl         ! variable volume 
    3435   USE bdy_oce   , ONLY: ln_bdy 
     
    179180            vn(:,:,jk) = va(:,:,jk) 
    180181         END DO 
     182         ! limit velocities 
     183         IF (ln_ulimit) THEN 
     184            call dyn_limit_velocity (kt) 
     185         ENDIF 
    181186         IF(.NOT.ln_linssh ) THEN 
    182187            DO jk = 1, jpkm1 
     
    203208               END DO 
    204209            END DO 
     210            ! limit velocities 
     211            IF (ln_ulimit) THEN 
     212               call dyn_limit_velocity (kt) 
     213            ENDIF 
    205214            !                             ! ================! 
    206215         ELSE                             ! Variable volume ! 
     
    250259                  END DO 
    251260               END DO 
     261               ! limit velocities 
     262               IF (ln_ulimit) THEN 
     263                  call dyn_limit_velocity (kt) 
     264               ENDIF 
    252265               ! 
    253266            ELSE                          ! Asselin filter applied on thickness weighted velocity 
     
    277290                  END DO 
    278291               END DO 
     292               ! limit velocities 
     293               IF (ln_ulimit) THEN 
     294                  call dyn_limit_velocity (kt) 
     295               ENDIF 
    279296               e3u_b(:,:,1:jpkm1) = ze3u_f(:,:,1:jpkm1)        ! e3u_b <-- filtered scale factor 
    280297               e3v_b(:,:,1:jpkm1) = ze3v_f(:,:,1:jpkm1) 
     
    353370   END SUBROUTINE dyn_nxt 
    354371 
     372   SUBROUTINE dyn_limit_velocity (kt) 
     373      ! limits maxming vlaues of un and vn by volume courant number 
     374      INTEGER, INTENT( in ) ::   kt      ! ocean time-step index 
     375      ! 
     376      INTEGER  ::   ji, jj, jk   ! dummy loop indices 
     377      REAL(wp) :: zzu,zplim,zmlim,isp,ism,zcn,ze3e1,zzcn,zcnn,idivp,idivm 
     378 
     379      ! limit fluxes 
     380      zcn =cn_ulimit !0.9 ! maximum velocity inverse courant number 
     381      zcnn = cnn_ulimit !0.54 ! how much to reduce cn by in divergen flow 
     382 
     383      DO jk = 1, jpkm1 
     384         DO jj = 1, jpjm1 
     385            DO ji = 1, jpim1 
     386               ! U direction 
     387               zzu = un(ji,jj,jk) 
     388               ze3e1 = e3u_n(ji  ,jj,jk) * e2u(ji  ,jj) 
     389               ! ips is 1 if flow is positive othersize zero 
     390               isp =  0.5 * (sign(1.0_wp,zzu) + 1.0_wp ) 
     391               ism = -0.5 * (sign(1.0_wp,zzu) - 1.0_wp ) 
     392               ! idev is 1 if divergent flow otherwise zero 
     393               idivp = -isp * 0.5 * (sign(1.0_wp, un(ji-1,jj,jk)) - 1.0_wp ) 
     394               idivm =  ism * 0.5 * (sign(1.0_wp, un(ji+1,jj,jk)) + 1.0_wp ) 
     395               zzcn = (idivp+idivm)*(zcnn-1.0_wp)+1.0_wp 
     396               zzcn = zzcn * zcn 
     397               zplim =  zzcn * (e3t_n(ji  ,jj,jk) * e1t(ji  ,jj) * e2t(ji  ,jj)) / & 
     398                                               (2.0*rdt * ze3e1)*umask(ji,jj,jk) 
     399               zmlim = -zzcn * (e3t_n(ji+1,jj,jk) * e1t(ji+1,jj) * e2t(ji+1,jj)) / & 
     400                                               (2.0*rdt * ze3e1)*umask(ji,jj,jk) 
     401               ! limit currents 
     402               un(ji,jj,jk) = min ( zzu,zplim) * isp + max (zzu,zmlim) *ism 
     403               ! V  direction 
     404               zzu = vn(ji,jj,jk) 
     405               ze3e1 = e3v_n(ji  ,jj,jk) * e1v(ji  ,jj) 
     406               isp =  0.5 * (sign(1.0_wp,zzu) + 1.0_wp ) 
     407               ism = -0.5 * (sign(1.0_wp,zzu) - 1.0_wp ) 
     408               ! idev is 1 if divergent flow otherwise zero 
     409               idivp = -isp * 0.5 * (sign(1.0_wp, vn(ji,jj-1,jk)) - 1.0_wp ) 
     410               idivm =  ism * 0.5 * (sign(1.0_wp, vn(ji,jj+1,jk)) + 1.0_wp ) 
     411               zzcn = (idivp+idivm)*(zcnn-1.0_wp)+1.0_wp 
     412               zzcn = zzcn * zcn 
     413               zplim =  zzcn * (e3t_n(ji,jj  ,jk) * e1t(ji,jj  ) * e2t(ji,jj  )) / & 
     414                                               (2.0*rdt * ze3e1)*vmask(ji,jj,jk) 
     415               zmlim = -zzcn * (e3t_n(ji,jj+1,jk) * e1t(ji,jj+1) * e2t(ji,jj+1)) / & 
     416                                               (2.0*rdt * ze3e1)*vmask(ji,jj,jk) 
     417               vn(ji,jj,jk) = min ( zzu,zplim) * isp + max (zzu,zmlim) *ism 
     418            ENDDO 
     419         ENDDO 
     420      ENDDO 
     421 
     422    END SUBROUTINE dyn_limit_velocity 
     423 
    355424   !!========================================================================= 
    356425END MODULE dynnxt 
Note: See TracChangeset for help on using the changeset viewer.