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 15422 for NEMO/branches/UKMO/r14075_India_uncoupled/src/OCE/DYN/dynnxt.F90 – NEMO

Ignore:
Timestamp:
2021-10-21T11:19:25+02:00 (3 years ago)
Author:
jcastill
Message:

Changes tested so that they can merged with the CO9 Met Office branch - jpmax_harmo should be 34 with FES14 tides, but the last components are not used anyway

File:
1 edited

Legend:

Unmodified
Added
Removed
  • NEMO/branches/UKMO/r14075_India_uncoupled/src/OCE/DYN/dynnxt.F90

    r14075 r15422  
    3333   USE dynadv         ! dynamics: vector invariant versus flux form 
    3434   USE dynspg_ts      ! surface pressure gradient: split-explicit scheme 
     35   USE dynspg 
    3536   USE domvvl         ! variable volume 
    3637   USE bdy_oce , ONLY : ln_bdy 
     
    5859   PUBLIC    dyn_nxt   ! routine called by step.F90 
    5960 
     61   !! Substitution  
     62#  include "vectopt_loop_substitute.h90" 
    6063   !!---------------------------------------------------------------------- 
    6164   !! NEMO/OCE 4.0 , NEMO Consortium (2018) 
     
    182185            vn(:,:,jk) = va(:,:,jk) 
    183186         END DO 
     187         ! limit velocities   
     188         IF (ln_ulimit) THEN   
     189            call dyn_limit_velocity (kt)   
     190         ENDIF 
    184191         IF( .NOT.ln_linssh ) THEN                          ! e3._b <-- e3._n 
    185192!!gm BUG ????    I don't understand why it is not : e3._n <-- e3._a   
     
    214221               END DO 
    215222            END DO 
     223            ! limit velocities   
     224            IF (ln_ulimit) THEN   
     225               call dyn_limit_velocity (kt)   
     226            ENDIF 
    216227            !                             ! ================! 
    217228         ELSE                             ! Variable volume ! 
     
    263274                  END DO 
    264275               END DO 
     276               ! limit velocities   
     277               IF (ln_ulimit) THEN   
     278                  call dyn_limit_velocity (kt)   
     279               ENDIF 
    265280               ! 
    266281            ELSE                          ! Asselin filter applied on thickness weighted velocity 
     
    290305                  END DO 
    291306               END DO 
     307               ! limit velocities   
     308               IF (ln_ulimit) THEN   
     309                  call dyn_limit_velocity (kt)   
     310               ENDIF 
    292311               e3u_b(:,:,1:jpkm1) = ze3u_f(:,:,1:jpkm1)        ! e3u_b <-- filtered scale factor 
    293312               e3v_b(:,:,1:jpkm1) = ze3v_f(:,:,1:jpkm1) 
     
    401420   END SUBROUTINE dyn_nxt 
    402421 
     422   SUBROUTINE dyn_limit_velocity (kt)   
     423      ! limits maximum values of un and vn by volume courant number   
     424      INTEGER, INTENT( in ) ::   kt      ! ocean time-step index   
     425      !   
     426      INTEGER  ::   ji, jj, jk   ! dummy loop indices   
     427      REAL(wp) ::   zzu,zplim,zmlim,isp,ism,zcn,ze3e1,zzcn,zcnn,idivp,idivm   
     428    
     429      ! limit fluxes   
     430      zcn =cn_ulimit !0.9 ! maximum velocity inverse courant number   
     431      zcnn = cnn_ulimit !0.54 ! how much to reduce cn by in divergen flow   
     432    
     433      DO jk = 1, jpkm1   
     434         DO jj = 2, jpjm1   
     435            DO ji = fs_2, fs_jpim1   ! vect. opt.  
     436               ! U direction   
     437               zzu = un(ji,jj,jk)   
     438               ze3e1 = e3u_n(ji  ,jj,jk) * e2u(ji  ,jj)   
     439               ! ips is 1 if flow is positive othersize zero   
     440               isp =  0.5 * (sign(1.0_wp,zzu) + 1.0_wp )   
     441               ism = -0.5 * (sign(1.0_wp,zzu) - 1.0_wp )   
     442               ! idev is 1 if divergent flow otherwise zero   
     443               idivp = -isp * 0.5 * (sign(1.0_wp, un(ji-1,jj,jk)) - 1.0_wp )   
     444               idivm =  ism * 0.5 * (sign(1.0_wp, un(ji+1,jj,jk)) + 1.0_wp )   
     445               zzcn = (idivp+idivm)*(zcnn-1.0_wp)+1.0_wp   
     446               zzcn = zzcn * zcn   
     447               zplim =  zzcn * (e3t_n(ji  ,jj,jk) * e1t(ji  ,jj) * e2t(ji  ,jj)) / &   
     448                                               (2.0*rdt * ze3e1)*umask(ji,jj,jk)   
     449               zmlim = -zzcn * (e3t_n(ji+1,jj,jk) * e1t(ji+1,jj) * e2t(ji+1,jj)) / &   
     450                                               (2.0*rdt * ze3e1)*umask(ji,jj,jk)   
     451               ! limit currents   
     452               un(ji,jj,jk) = min ( zzu,zplim) * isp + max(zzu,zmlim) *ism   
     453    
     454               ! V  direction   
     455               zzu = vn(ji,jj,jk)   
     456               ze3e1 = e3v_n(ji  ,jj,jk) * e1v(ji  ,jj)   
     457               isp =  0.5 * (sign(1.0_wp,zzu) + 1.0_wp )   
     458               ism = -0.5 * (sign(1.0_wp,zzu) - 1.0_wp )   
     459               ! idev is 1 if divergent flow otherwise zero   
     460               idivp = -isp * 0.5 * (sign(1.0_wp, vn(ji,jj-1,jk)) - 1.0_wp )   
     461               idivm =  ism * 0.5 * (sign(1.0_wp, vn(ji,jj+1,jk)) + 1.0_wp )   
     462               zzcn = (idivp+idivm)*(zcnn-1.0_wp)+1.0_wp   
     463               zzcn = zzcn * zcn   
     464               zplim =  zzcn * (e3t_n(ji,jj  ,jk) * e1t(ji,jj  ) * e2t(ji,jj  )) / &   
     465                                               (2.0*rdt * ze3e1)*vmask(ji,jj,jk)   
     466               zmlim = -zzcn * (e3t_n(ji,jj+1,jk) * e1t(ji,jj+1) * e2t(ji,jj+1)) / &   
     467                                               (2.0*rdt * ze3e1)*vmask(ji,jj,jk)   
     468               ! limit currents   
     469               vn(ji,jj,jk) = min ( zzu,zplim) * isp + max(zzu,zmlim) *ism   
     470            ENDDO   
     471         ENDDO   
     472      ENDDO   
     473       CALL lbc_lnk_multi( 'dynnxt', un(:,:,:), 'U',  -1., vn(:,:,:), 'V',  -1. )  
     474    
     475    END SUBROUTINE dyn_limit_velocity 
     476 
    403477   !!========================================================================= 
    404478END MODULE dynnxt 
Note: See TracChangeset for help on using the changeset viewer.