Changeset 2389 for trunk/NEMO/OPA_SRC/LDF/ldfslp.F90
- Timestamp:
- 2010-11-15T16:52:06+01:00 (14 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/NEMO/OPA_SRC/LDF/ldfslp.F90
r1515 r2389 9 9 !! NEMO 0.5 ! 2002-10 (G. Madec) Free form, F90 10 10 !! 1.0 ! 2005-10 (A. Beckmann) correction for s-coordinates 11 !! 3.2 ! 2010-11 (F. Dupond, G. Madec) bug correction in slopes just below the ML 11 12 !!---------------------------------------------------------------------- 12 13 #if defined key_ldfslp || defined key_esopa … … 14 15 !! 'key_ldfslp' Rotation of lateral mixing tensor 15 16 !!---------------------------------------------------------------------- 16 !! ldf_slp : compute the slopes of neutral surface17 !! ldf_slp_mxl : compute the slopes of iso-neutral surface 17 !! ldf_slp : compute the slopes of iso-neutral surface 18 !! ldf_slp_mxl : compute the slopes of iso-neutral surface just below the Mixed Layer 18 19 !! ldf_slp_init : initialization of the slopes computation 19 20 !!---------------------------------------------------------------------- … … 130 131 ENDIF 131 132 132 CALL ldf_slp_mxl( prd, pn2 ) ! Slopes of isopycnal surfaces just below the mixed layer 133 133 134 ! !* Local vertical density gradient evaluated from N^2 135 DO jk = 2, jpkm1 ! zwy = d/dz(prd)= - ( prd ) / grav * mk(pn2) -- at t point 136 zwy(:,:,jk) = zmg * ( prd(:,:,jk) + 1. ) * ( pn2 (:,:,jk) + pn2 (:,:,jk+1) ) & 137 & / MAX( tmask(:,:,jk) + tmask(:,:,jk+1), 1. ) 138 END DO 139 zwy(:,:,1) = 0.e0 ! surface value set to zero 140 141 142 CALL ldf_slp_mxl( prd, pn2 ) !* Slopes of isopycnal surfaces just below the mixed layer 143 134 144 135 145 ! I. slopes at u and v point | uslp = d/di( prd ) / d/dz( prd ) 136 146 ! =========================== | vslp = d/dj( prd ) / d/dz( prd ) 137 147 ! 138 ! !* Local vertical density gradient evaluated from N^2139 DO jk = 2, jpkm1 ! zwy = d/dz(prd)= - ( prd ) / grav * mk(pn2) -- at t point140 DO jj = 1, jpj141 DO ji = 1, jpi142 zwy(ji,jj,jk) = zmg * ( prd(ji,jj,jk) + 1. ) * ( pn2 (ji,jj,jk) + pn2 (ji,jj,jk+1) ) &143 & / MAX( tmask(ji,jj,jk) + tmask(ji,jj,jk+1), 1. )144 END DO145 END DO146 END DO147 148 DO jk = 2, jpkm1 !* Slopes at u and v points 148 149 DO jj = 2, jpjm1 … … 349 350 !! the mixed layer. 350 351 !! 351 !! ** Method : 352 !! The slope in the i-direction is computed at u- and w-points 353 !! (uslp, wslpi) and the slope in the j-direction is computed at 354 !! v- and w-points (vslp, wslpj). 355 !! They are bounded by 1/100 over the whole ocean, and within the 356 !! surface layer they are bounded by the distance to the surface 357 !! ( slope<= depth/l where l is the length scale of horizontal 358 !! diffusion (here, aht=2000m2/s ==> l=20km with a typical velocity 359 !! of 10cm/s) 360 !! 361 !! ** Action : Compute uslp, wslpi, and vslp, wslpj, the i- and j-slopes 362 !! of now neutral surfaces at u-, w- and v- w-points, resp. 363 !!---------------------------------------------------------------------- 364 USE oce , zgru => ua ! ua, va used as workspace and set to hor. 365 USE oce , zgrv => va ! density gradient in ldf_slp 352 !! ** Method : caution: use zgru, zgrv and zwy computed in ldf_slp 353 !! 354 !! ** Action : uslpml, wslpiml : i- & j-slopes of neutral surfaces 355 !! vslpml, wslpjml just below the mixed layer 356 !! omlmask : mixed layer mask 357 !!---------------------------------------------------------------------- 358 USE oce , zgru => ua ! zgru, zgrv (ua, va used as workspace) 359 USE oce , zgrv => va ! set to i- & j-density gradient in ldf_slp 360 USE oce , zwy => ta ! set to vertical density gradient at T-point in ldfslp 366 361 !! 367 362 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(in) :: prd ! in situ density … … 374 369 REAL(wp) :: zau, zbu, zai, zbi ! - - 375 370 REAL(wp) :: zav, zbv, zaj, zbj ! - - 376 REAL(wp) , DIMENSION(jpi,jpj) :: zwy ! 2D workspace371 REAL(wp) :: zbw ! - - 377 372 !!---------------------------------------------------------------------- 378 373 … … 414 409 !----------------------------------------------------------------------- 415 410 ! 416 zwy(:,jpj) = 0.e0 !* vertical density gradient for u-slope (from N^2)417 zwy(jpi,:) = 0.e0418 # if defined key_vectopt_loop419 DO jj = 1, 1420 DO ji = 1, jpij-jpi ! vector opt. (forced unrolling)421 # else422 DO jj = 1, jpjm1423 DO ji = 1, jpim1424 # endif425 ik = MAX( 1, nmln(ji,jj) , nmln(ji+1,jj) ) ! avoid spurious recirculation426 ik = MIN( ik, jpkm1 ) ! if ik = jpk take jpkm1 values427 zwy(ji,jj) = zmg * ( prd(ji,jj,ik) + 1. ) * ( pn2 (ji,jj,ik) + pn2 (ji,jj,ik+1) ) &428 & / MAX( tmask(ji,jj,ik) + tmask(ji,jj,ik+1), 1. )429 END DO430 END DO431 CALL lbc_lnk( zwy, 'U', 1. ) ! lateral boundary conditions NO sign change432 433 411 ! !* Slope at u points 434 412 # if defined key_vectopt_loop … … 443 421 ik = MIN( ik, jpkm1 ) 444 422 zau = 1./ e1u(ji,jj) * zgru(ji,jj,ik) 445 zbu = 0.5*( zwy(ji,jj ) + zwy(ji+1,jj) )423 zbu = 0.5*( zwy(ji,jj,ik) + zwy(ji+1,jj,ik) ) 446 424 ! bound the slopes: abs(zw.)<= 1/100 and zb..<0 447 425 ! kxz max= ah slope max =< e1 e3 /(pi**2 2 dt) … … 452 430 END DO 453 431 CALL lbc_lnk( uslpml, 'U', -1. ) ! lateral boundary conditions (i-gradient => sign change) 454 455 ! !* vertical density gradient for v-slope (from N^2)456 # if defined key_vectopt_loop457 DO jj = 1, 1458 DO ji = 1, jpij-jpi ! vector opt. (forced unrolling)459 # else460 DO jj = 1, jpjm1461 DO ji = 1, jpim1462 # endif463 ik = MAX( 1, nmln(ji,jj) , nmln(ji,jj+1) )464 ik = MIN( ik, jpkm1 )465 zwy(ji,jj) = zmg * ( prd(ji,jj,ik) + 1. ) * ( pn2 (ji,jj,ik) + pn2 (ji,jj,ik+1) ) &466 & / MAX( tmask(ji,jj,ik) + tmask(ji,jj,ik+1), 1. )467 END DO468 END DO469 CALL lbc_lnk( zwy, 'V', 1. ) ! lateral boundary conditions NO sign change470 432 471 433 ! !* Slope at v points … … 481 443 ik = MIN( ik,jpkm1 ) 482 444 zav = 1./ e2v(ji,jj) * zgrv(ji,jj,ik) 483 zbv = 0.5*( zwy(ji,jj ) + zwy(ji,jj+1) )445 zbv = 0.5*( zwy(ji,jj,ik) + zwy(ji,jj+1,ik) ) 484 446 ! bound the slopes: abs(zw.)<= 1/100 and zb..<0 485 447 ! kxz max= ah slope max =< e1 e3 /(pi**2 2 dt) … … 490 452 END DO 491 453 CALL lbc_lnk( vslpml, 'V', -1. ) ! lateral boundary conditions (j-gradient => sign change) 492 493 494 ! !* vertical density gradient for w-slope (from N^2)495 # if defined key_vectopt_loop496 DO jj = 1, 1497 DO ji = 1, jpij ! vector opt. (forced unrolling)498 # else499 DO jj = 1, jpj500 DO ji = 1, jpi501 # endif502 ik = nmln(ji,jj) + 1503 ik = MIN( ik, jpk )504 ikm1 = MAX ( 1, ik-1)505 zwy (ji,jj) = zm05g * pn2 (ji,jj,ik) * &506 & ( prd (ji,jj,ik) + prd (ji,jj,ikm1) + 2. )507 END DO508 END DO509 454 510 455 ! !* Slopes at w points … … 531 476 zaj = zcoef2 * ( zgrv(ji,jj ,ik ) + zgrv(ji,jj ,ikm1) & 532 477 & + zgrv(ji,jj-1,ikm1) + zgrv(ji,jj-1,ik ) ) * tmask (ji,jj,ik) 478 ! vertical density gradient at w-point (from N^2) 479 zbw = zm05g * pn2 (ji,jj,ik) * ( prd (ji,jj,ik) + prd (ji,jj,ikm1) + 2. ) 533 480 ! bound the slopes: abs(zw.)<= 1/100 and zb..<0. 534 481 ! static instability: 535 482 ! kxz max= ah slope max =< e1 e3 /(pi**2 2 dt) 536 zbi = MIN ( z wy (ji,jj),- 100.*ABS(zai), -7.e+3/fse3w(ji,jj,ik)*ABS(zai) )537 zbj = MIN ( z wy (ji,jj), -100.*ABS(zaj), -7.e+3/fse3w(ji,jj,ik)*ABS(zaj) )483 zbi = MIN ( zbw,- 100.*ABS(zai), -7.e+3/fse3w(ji,jj,ik)*ABS(zai) ) 484 zbj = MIN ( zbw, -100.*ABS(zaj), -7.e+3/fse3w(ji,jj,ik)*ABS(zaj) ) 538 485 ! wslpiml and wslpjml 539 486 wslpiml (ji,jj) = zai / ( zbi - zeps) * tmask (ji,jj,ik)
Note: See TracChangeset
for help on using the changeset viewer.