- Timestamp:
- 2021-10-21T11:19:25+02:00 (3 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
NEMO/branches/UKMO/r14075_India_uncoupled/src/OCE/DYN/dynnxt.F90
r14075 r15422 33 33 USE dynadv ! dynamics: vector invariant versus flux form 34 34 USE dynspg_ts ! surface pressure gradient: split-explicit scheme 35 USE dynspg 35 36 USE domvvl ! variable volume 36 37 USE bdy_oce , ONLY : ln_bdy … … 58 59 PUBLIC dyn_nxt ! routine called by step.F90 59 60 61 !! Substitution 62 # include "vectopt_loop_substitute.h90" 60 63 !!---------------------------------------------------------------------- 61 64 !! NEMO/OCE 4.0 , NEMO Consortium (2018) … … 182 185 vn(:,:,jk) = va(:,:,jk) 183 186 END DO 187 ! limit velocities 188 IF (ln_ulimit) THEN 189 call dyn_limit_velocity (kt) 190 ENDIF 184 191 IF( .NOT.ln_linssh ) THEN ! e3._b <-- e3._n 185 192 !!gm BUG ???? I don't understand why it is not : e3._n <-- e3._a … … 214 221 END DO 215 222 END DO 223 ! limit velocities 224 IF (ln_ulimit) THEN 225 call dyn_limit_velocity (kt) 226 ENDIF 216 227 ! ! ================! 217 228 ELSE ! Variable volume ! … … 263 274 END DO 264 275 END DO 276 ! limit velocities 277 IF (ln_ulimit) THEN 278 call dyn_limit_velocity (kt) 279 ENDIF 265 280 ! 266 281 ELSE ! Asselin filter applied on thickness weighted velocity … … 290 305 END DO 291 306 END DO 307 ! limit velocities 308 IF (ln_ulimit) THEN 309 call dyn_limit_velocity (kt) 310 ENDIF 292 311 e3u_b(:,:,1:jpkm1) = ze3u_f(:,:,1:jpkm1) ! e3u_b <-- filtered scale factor 293 312 e3v_b(:,:,1:jpkm1) = ze3v_f(:,:,1:jpkm1) … … 401 420 END SUBROUTINE dyn_nxt 402 421 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 403 477 !!========================================================================= 404 478 END MODULE dynnxt
Note: See TracChangeset
for help on using the changeset viewer.