- Timestamp:
- 2019-06-06T15:32:24+02:00 (5 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/UKMO/r8395_India_uncoupled/NEMOGCM/NEMO/OPA_SRC/DYN/dynnxt.F90
r10684 r11080 31 31 USE dynadv ! dynamics: vector invariant versus flux form 32 32 USE dynspg_ts ! surface pressure gradient: split-explicit scheme 33 USE dynspg 33 34 USE domvvl ! variable volume 34 35 USE bdy_oce , ONLY: ln_bdy … … 179 180 vn(:,:,jk) = va(:,:,jk) 180 181 END DO 182 ! limit velocities 183 IF (ln_ulimit) THEN 184 call dyn_limit_velocity (kt) 185 ENDIF 181 186 IF(.NOT.ln_linssh ) THEN 182 187 DO jk = 1, jpkm1 … … 203 208 END DO 204 209 END DO 210 ! limit velocities 211 IF (ln_ulimit) THEN 212 call dyn_limit_velocity (kt) 213 ENDIF 205 214 ! ! ================! 206 215 ELSE ! Variable volume ! … … 250 259 END DO 251 260 END DO 261 ! limit velocities 262 IF (ln_ulimit) THEN 263 call dyn_limit_velocity (kt) 264 ENDIF 252 265 ! 253 266 ELSE ! Asselin filter applied on thickness weighted velocity … … 277 290 END DO 278 291 END DO 292 ! limit velocities 293 IF (ln_ulimit) THEN 294 call dyn_limit_velocity (kt) 295 ENDIF 279 296 e3u_b(:,:,1:jpkm1) = ze3u_f(:,:,1:jpkm1) ! e3u_b <-- filtered scale factor 280 297 e3v_b(:,:,1:jpkm1) = ze3v_f(:,:,1:jpkm1) … … 353 370 END SUBROUTINE dyn_nxt 354 371 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 355 424 !!========================================================================= 356 425 END MODULE dynnxt
Note: See TracChangeset
for help on using the changeset viewer.