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 6012 for branches/2015/dev_MetOffice_merge_2015/NEMOGCM/NEMO/OPA_SRC/LDF/ldfslp.F90 – NEMO

Ignore:
Timestamp:
2015-12-07T16:11:45+01:00 (8 years ago)
Author:
mathiot
Message:

merge MetO branch with dev_r5151_UKMO_ISF

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/2015/dev_MetOffice_merge_2015/NEMOGCM/NEMO/OPA_SRC/LDF/ldfslp.F90

    r5836 r6012  
    112112      !! 
    113113      INTEGER  ::   ji , jj , jk    ! dummy loop indices 
    114       INTEGER  ::   ii0, ii1, iku   ! temporary integer 
    115       INTEGER  ::   ij0, ij1, ikv   ! temporary integer 
     114      INTEGER  ::   ii0, ii1        ! temporary integer 
     115      INTEGER  ::   ij0, ij1        ! temporary integer 
    116116      REAL(wp) ::   zeps, zm1_g, zm1_2g, z1_16, zcofw, z1_slpmax ! local scalars 
    117117      REAL(wp) ::   zci, zfi, zau, zbu, zai, zbi   !   -      - 
    118118      REAL(wp) ::   zcj, zfj, zav, zbv, zaj, zbj   !   -      - 
    119119      REAL(wp) ::   zck, zfk,      zbw             !   -      - 
     120      REAL(wp) ::   zdepu, zdepv                   !   -      - 
     121      REAL(wp), POINTER, DIMENSION(:,:  ) ::  zslpml_hmlpu, zslpml_hmlpv 
    120122      REAL(wp), POINTER, DIMENSION(:,:,:) ::  zwz, zww 
    121123      REAL(wp), POINTER, DIMENSION(:,:,:) ::  zdzr 
     
    126128      ! 
    127129      CALL wrk_alloc( jpi,jpj,jpk, zwz, zww, zdzr, zgru, zgrv ) 
     130      CALL wrk_alloc( jpi,jpj, zslpml_hmlpu, zslpml_hmlpv ) 
    128131 
    129132      zeps   =  1.e-20_wp        !==   Local constant initialization   ==! 
     
    149152               zgru(ji,jj,mbku(ji,jj)) = gru(ji,jj) 
    150153               zgrv(ji,jj,mbkv(ji,jj)) = grv(ji,jj) 
     154            END DO 
     155         END DO 
     156      ENDIF 
     157      IF( ln_zps .AND. ln_isfcav ) THEN           ! partial steps correction at the bottom ocean level 
     158         DO jj = 1, jpjm1 
     159            DO ji = 1, jpim1 
     160               IF ( miku(ji,jj) > 1 ) zgru(ji,jj,miku(ji,jj)) = grui(ji,jj)  
     161               IF ( mikv(ji,jj) > 1 ) zgrv(ji,jj,mikv(ji,jj)) = grvi(ji,jj) 
    151162            END DO 
    152163         END DO 
     
    171182      ! ===========================      | vslp = d/dj( prd ) / d/dz( prd ) 
    172183      ! 
     184      IF ( ln_isfcav ) THEN 
     185         DO jj = 2, jpjm1 
     186            DO ji = fs_2, fs_jpim1   ! vector opt. 
     187               zslpml_hmlpu(ji,jj) = uslpml(ji,jj) / ( MAX(hmlpt(ji,jj), hmlpt(ji+1,jj  ), 5._wp)       & 
     188                  &                                  - 0.5_wp * ( risfdep(ji,jj) + risfdep(ji+1,jj  ) ) ) 
     189               zslpml_hmlpv(ji,jj) = vslpml(ji,jj) / ( MAX(hmlpt(ji,jj), hmlpt(ji  ,jj+1), 5._wp)       & 
     190                  &                                  - 0.5_wp * ( risfdep(ji,jj) + risfdep(ji  ,jj+1) ) ) 
     191            END DO 
     192         END DO 
     193      ELSE 
     194         DO jj = 2, jpjm1 
     195            DO ji = fs_2, fs_jpim1   ! vector opt. 
     196               zslpml_hmlpu(ji,jj) = uslpml(ji,jj) / MAX(hmlpt(ji,jj), hmlpt(ji+1,jj  ), 5._wp) 
     197               zslpml_hmlpv(ji,jj) = vslpml(ji,jj) / MAX(hmlpt(ji,jj), hmlpt(ji  ,jj+1), 5._wp) 
     198            END DO 
     199         END DO 
     200      END IF 
     201 
    173202      DO jk = 2, jpkm1                            !* Slopes at u and v points 
    174203         DO jj = 2, jpjm1 
     
    186215               zfi = MAX( omlmask(ji,jj,jk), omlmask(ji+1,jj,jk) ) 
    187216               zfj = MAX( omlmask(ji,jj,jk), omlmask(ji,jj+1,jk) ) 
    188                zwz(ji,jj,jk) = ( ( 1. - zfi) * zau / ( zbu - zeps )                                              & 
    189                   &                   + zfi  * uslpml(ji,jj)                                                     & 
    190                   &                          * 0.5_wp * ( fsdept(ji+1,jj,jk)+fsdept(ji,jj,jk)-fse3u(ji,jj,1) )   & 
    191                   &                          / MAX( hmlpt(ji,jj), hmlpt(ji+1,jj), 5._wp ) ) * umask(ji,jj,jk) 
    192                zww(ji,jj,jk) = ( ( 1. - zfj) * zav / ( zbv - zeps )                                              & 
    193                   &                   + zfj  * vslpml(ji,jj)                                                     & 
    194                   &                          * 0.5_wp * ( fsdept(ji,jj+1,jk)+fsdept(ji,jj,jk)-fse3v(ji,jj,1) )   & 
    195                   &                          / MAX( hmlpt(ji,jj), hmlpt(ji,jj+1), 5. ) ) * vmask(ji,jj,jk) 
     217               ! thickness of water column between surface and level k at u/v point 
     218               zdepu = 0.5_wp * ( ( fsdept (ji,jj,jk) + fsdept (ji+1,jj  ,jk) )                            & 
     219                                - ( risfdep(ji,jj)    + risfdep(ji+1,jj)    ) - fse3u(ji,jj,miku(ji,jj)) ) 
     220               zdepv = 0.5_wp * ( ( fsdept (ji,jj,jk) + fsdept (ji,jj+1,jk) )                              & 
     221                                - ( risfdep(ji,jj)    + risfdep(ji,jj+1)    ) - fse3v(ji,jj,mikv(ji,jj)) ) 
     222               ! 
     223               zwz(ji,jj,jk) = ( ( 1._wp - zfi) * zau / ( zbu - zeps )                                     & 
     224                  &                      + zfi  * zdepu * zslpml_hmlpu(ji,jj) ) * umask(ji,jj,jk) 
     225               zww(ji,jj,jk) = ( ( 1._wp - zfj) * zav / ( zbv - zeps )                                     & 
     226                  &                      + zfj  * zdepv * zslpml_hmlpv(ji,jj) ) * vmask(ji,jj,jk) 
    196227!!gm  modif to suppress omlmask.... (as in Griffies case) 
    197228!               !                                         ! jk must be >= ML level for zf=1. otherwise  zf=0. 
     
    265296                  &      + vmask(ji,jj-1,jk-1) + vmask(ji,jj,jk  ) , zeps  ) * e2t(ji,jj) 
    266297               zai =    (  zgru (ji-1,jj,jk  ) + zgru (ji,jj,jk-1)           & 
    267                   &      + zgru (ji-1,jj,jk-1) + zgru (ji,jj,jk  )   ) / zci * tmask (ji,jj,jk) 
     298                  &      + zgru (ji-1,jj,jk-1) + zgru (ji,jj,jk  )   ) / zci * wmask (ji,jj,jk) 
    268299               zaj =    (  zgrv (ji,jj-1,jk  ) + zgrv (ji,jj,jk-1)           & 
    269                   &      + zgrv (ji,jj-1,jk-1) + zgrv (ji,jj,jk  )   ) / zcj * tmask (ji,jj,jk) 
     300                  &      + zgrv (ji,jj-1,jk-1) + zgrv (ji,jj,jk  )   ) / zcj * wmask (ji,jj,jk) 
    270301               !                                        ! bound the slopes: abs(zw.)<= 1/100 and zb..<0. 
    271302               !                                        ! + kxz max= ah slope max =< e1 e3 /(pi**2 2 dt) 
     
    274305               !                                        ! wslpi and wslpj with ML flattening (output in zwz and zww, resp.) 
    275306               zfk = MAX( omlmask(ji,jj,jk), omlmask(ji,jj,jk-1) )   ! zfk=1 in the ML otherwise zfk=0 
    276                zck = fsdepw(ji,jj,jk) / MAX( hmlp(ji,jj), 10._wp ) 
    277                zwz(ji,jj,jk) = (  zai / ( zbi - zeps ) * ( 1._wp - zfk ) + zck * wslpiml(ji,jj) * zfk  ) * tmask(ji,jj,jk) 
    278                zww(ji,jj,jk) = (  zaj / ( zbj - zeps ) * ( 1._wp - zfk ) + zck * wslpjml(ji,jj) * zfk  ) * tmask(ji,jj,jk) 
     307               zck = ( fsdepw(ji,jj,jk) - fsdepw(ji,jj,mikt(ji,jj) ) ) / MAX( hmlp(ji,jj) - fsdepw(ji,jj,mikt(ji,jj)), 10._wp ) 
     308               zwz(ji,jj,jk) = (  zai / ( zbi - zeps ) * ( 1._wp - zfk ) + zck * wslpiml(ji,jj) * zfk  ) * wmask(ji,jj,jk) 
     309               zww(ji,jj,jk) = (  zaj / ( zbj - zeps ) * ( 1._wp - zfk ) + zck * wslpjml(ji,jj) * zfk  ) * wmask(ji,jj,jk) 
    279310 
    280311!!gm  modif to suppress omlmask....  (as in Griffies operator) 
     
    340371      CALL lbc_lnk( wslpi, 'W', -1. )      ;      CALL lbc_lnk( wslpj, 'W', -1. ) 
    341372 
    342  
    343373      IF(ln_ctl) THEN 
    344374         CALL prt_ctl(tab3d_1=uslp , clinfo1=' slp  - u : ', tab3d_2=vslp,  clinfo2=' v : ', kdim=jpk) 
     
    347377      ! 
    348378      CALL wrk_dealloc( jpi,jpj,jpk, zwz, zww, zdzr, zgru, zgrv ) 
     379      CALL wrk_dealloc( jpi,jpj, zslpml_hmlpu, zslpml_hmlpv ) 
    349380      ! 
    350381      IF( nn_timing == 1 )  CALL timing_stop('ldf_slp') 
     
    486517                  ! 
    487518                  jk = nmln(ji,jj+jp) + 1 
    488                   IF( jk .GT. mbkt(ji,jj+jp) ) THEN  !ML reaches bottom 
     519                  IF( jk > mbkt(ji,jj+jp) ) THEN  !ML reaches bottom 
    489520                     ztj_mlb(ji   ,jj+jp,1-jp,kp) = 0.0_wp 
    490521                  ELSE 
     
    699730            zcj = MAX(   vmask(ji,jj-1,ik  ) + vmask(ji,jj,ik  )           & 
    700731               &       + vmask(ji,jj-1,ikm1) + vmask(ji,jj,ikm1) , zeps  ) * e2t(ji,jj) 
    701             zai =    (   p_gru(ji-1,jj,ik  ) + p_gru(ji,jj,ik)           & 
     732            zai =    (   p_gru(ji-1,jj,ik  ) + p_gru(ji,jj,ik)             & 
    702733               &       + p_gru(ji-1,jj,ikm1) + p_gru(ji,jj,ikm1  )  ) / zci  * tmask(ji,jj,ik) 
    703734            zaj =    (   p_grv(ji,jj-1,ik  ) + p_grv(ji,jj,ik  )           & 
Note: See TracChangeset for help on using the changeset viewer.