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 7990 for branches/2017/dev_r7881_HPC09_ZDF/NEMOGCM/NEMO/OPA_SRC/ZDF/zdfgls.F90 – NEMO

Ignore:
Timestamp:
2017-04-29T17:24:54+02:00 (7 years ago)
Author:
gm
Message:

#1880 (HPC-09): OPA remove avmu, avmv from zdf modules + move CALL tke(gls)_rst & gls_rst in zdftke(gls) + rename zdftmx and zdfqiao

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/2017/dev_r7881_HPC09_ZDF/NEMOGCM/NEMO/OPA_SRC/ZDF/zdfgls.F90

    r7953 r7990  
    55   !!                 turbulent closure parameterization 
    66   !!====================================================================== 
    7    !! History :   3.0  !  2009-09  (G. Reffray)  Original code 
    8    !!             3.3  !  2010-10  (C. Bricaud)  Add in the reference 
     7   !! History :  3.0  !  2009-09  (G. Reffray)  Original code 
     8   !!            3.3  !  2010-10  (C. Bricaud)  Add in the reference 
     9   !!            4.0  !  2017-04  (G. Madec)  remove CPP keys & avm at t-point only  
    910   !!---------------------------------------------------------------------- 
    1011 
     
    3637   PRIVATE 
    3738 
    38    PUBLIC   zdf_gls        ! routine called in step module 
    39    PUBLIC   zdf_gls_init   ! routine called in zdfphy module 
    40    PUBLIC   gls_rst        ! routine called in zdfphy module 
     39   PUBLIC   zdf_gls        ! called in zdfphy 
     40   PUBLIC   zdf_gls_init   ! called in zdfphy 
     41   PUBLIC   gls_rst        ! called in zdfphy 
    4142 
    4243   ! 
    43    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   mxln    !: now mixing length 
     44   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   hmxn    !: now mixing length 
    4445   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   zwall   !: wall function 
    4546   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   ustars2 !: Squared surface velocity scale at T-points 
     
    113114      !!                ***  FUNCTION zdf_gls_alloc  *** 
    114115      !!---------------------------------------------------------------------- 
    115       ALLOCATE( mxln(jpi,jpj,jpk), zwall(jpi,jpj,jpk) ,     & 
     116      ALLOCATE( hmxn(jpi,jpj,jpk), zwall(jpi,jpj,jpk) ,     & 
    116117         &      ustars2(jpi,jpj) , ustarb2(jpi,jpj)   , STAT= zdf_gls_alloc ) 
    117118         ! 
     
    148149      REAL(wp), POINTER, DIMENSION(:,:,:) ::   z_elem_b    ! element of the second matrix diagonal 
    149150      REAL(wp), POINTER, DIMENSION(:,:,:) ::   z_elem_c    ! element of the third  matrix diagonal 
     151      REAL(wp), POINTER, DIMENSION(:,:,:) ::   z3du, z3dv  ! u- and v-shears 
    150152      !!-------------------------------------------------------------------- 
    151153      ! 
    152       IF( nn_timing == 1 )  CALL timing_start('zdf_gls') 
     154      IF( nn_timing == 1 )   CALL timing_start('zdf_gls') 
    153155      ! 
    154156      CALL wrk_alloc( jpi,jpj,       zdep, zkar, zflxs, zhsro ) 
    155       CALL wrk_alloc( jpi,jpj,jpk,   eb, mxlb, shear, eps, zwall_psi, z_elem_a, z_elem_b, z_elem_c, psi  ) 
    156        
     157      CALL wrk_alloc( jpi,jpj,jpk,   eb, mxlb, shear, eps, zwall_psi, z_elem_a, z_elem_b, z_elem_c, psi ) 
     158      CALL wrk_alloc( jpi,jpj,jpk,   z3du, z3dv ) 
     159 
    157160      ! Preliminary computing 
    158161 
    159162      ustars2 = 0._wp   ;   ustarb2 = 0._wp   ;   psi  = 0._wp   ;   zwall_psi = 0._wp 
    160163 
    161       IF( kt /= nit000 ) THEN   ! restore before value to compute tke 
    162          avt (:,:,:) = avt_k (:,:,:) 
    163          avm (:,:,:) = avm_k (:,:,:) 
    164          avmu(:,:,:) = avmu_k(:,:,:) 
    165          avmv(:,:,:) = avmv_k(:,:,:)  
    166       ENDIF 
     164      ! restore before values computed GLS alone 
     165      avt(:,:,:) = avt_k(:,:,:) 
     166      avm(:,:,:) = avm_k(:,:,:) 
    167167 
    168168      ! Compute surface and bottom friction at T-points 
     
    183183      END DO     
    184184 
    185       ! Set surface roughness length 
    186       SELECT CASE ( nn_z0_met ) 
    187       ! 
    188       CASE ( 0 )             ! Constant roughness           
     185      SELECT CASE ( nn_z0_met )      !==  Set surface roughness length  ==! 
     186      CASE ( 0 )                          ! Constant roughness           
    189187         zhsro(:,:) = rn_hsro 
    190188      CASE ( 1 )             ! Standard Charnock formula 
    191189         zhsro(:,:) = MAX(rsbc_zs1 * ustars2(:,:), rn_hsro) 
    192190      CASE ( 2 )             ! Roughness formulae according to Rascle et al., Ocean Modelling (2008) 
     191!!gm         zcof = 2._wp * 0.6_wp / 28._wp 
     192!!gm         zdep(:,:)  = 30._wp * TANH(  zcof/ SQRT( MAX(ustars2(:,:),rsmall) )  )      ! Wave age (eq. 10) 
    193193         zdep(:,:)  = 30.*TANH(2.*0.3/(28.*SQRT(MAX(ustars2(:,:),rsmall))))             ! Wave age (eq. 10) 
    194194         zhsro(:,:) = MAX(rsbc_zs2 * ustars2(:,:) * zdep(:,:)**1.5, rn_hsro) ! zhsro = rn_frac_hs * Hsw (eq. 11) 
    195195      CASE ( 3 )             ! Roughness given by the wave model (coupled or read in file) 
     196!!gm  BUG missing a multiplicative coefficient.... 
    196197         zhsro(:,:) = hsw(:,:) 
    197198      END SELECT 
    198199 
    199       ! Compute shear and dissipation rate 
    200       DO jk = 2, jpkm1 
    201          DO jj = 2, jpjm1 
    202             DO ji = fs_2, fs_jpim1   ! vector opt. 
    203                avmu(ji,jj,jk) = avmu(ji,jj,jk) * ( un(ji,jj,jk-1) - un(ji,jj,jk) )   & 
    204                   &                            * ( ub(ji,jj,jk-1) - ub(ji,jj,jk) )   & 
    205                   &                            / (  e3uw_n(ji,jj,jk) * e3uw_b(ji,jj,jk) ) 
    206                avmv(ji,jj,jk) = avmv(ji,jj,jk) * ( vn(ji,jj,jk-1) - vn(ji,jj,jk) )   & 
    207                   &                            * ( vb(ji,jj,jk-1) - vb(ji,jj,jk) )   & 
    208                   &                            / (  e3vw_n(ji,jj,jk) * e3vw_b(ji,jj,jk) ) 
    209                eps(ji,jj,jk)  = rc03 * en(ji,jj,jk) * SQRT(en(ji,jj,jk)) / mxln(ji,jj,jk) 
     200      DO jk = 2, jpkm1              !==  Compute shear and dissipation rate  ==! 
     201         DO jj = 1, jpjm1 
     202            DO ji = 1, jpim1 
     203               z3du(ji,jj,jk) = 0.5 * ( avm(ji,jj,jk  ) + avm(ji+1,jj,jk) )   & 
     204                  &                 * (  un(ji,jj,jk-1) -  un(ji  ,jj,jk) )   & 
     205                  &                 * (  ub(ji,jj,jk-1) -  ub(ji  ,jj,jk) ) / (  e3uw_n(ji,jj,jk) * e3uw_b(ji,jj,jk) ) 
     206               z3dv(ji,jj,jk) = 0.5 * ( avm(ji,jj,jk  ) + avm(ji,jj+1,jk) )   & 
     207                  &                 * (  vn(ji,jj,jk-1) -  vn(ji,jj  ,jk) )   & 
     208                  &                 * (  vb(ji,jj,jk-1) -  vb(ji,jj  ,jk) ) / (  e3vw_n(ji,jj,jk) * e3vw_b(ji,jj,jk) ) 
     209                  ! 
     210               eps(ji,jj,jk)  = rc03 * en(ji,jj,jk) * SQRT(en(ji,jj,jk)) / hmxn(ji,jj,jk) 
    210211            END DO 
    211212         END DO 
    212213      END DO 
    213       ! 
    214       ! Lateral boundary conditions (avmu,avmv) (sign unchanged) 
    215       CALL lbc_lnk( avmu, 'U', 1. )   ;   CALL lbc_lnk( avmv, 'V', 1. ) 
    216214 
    217215      ! Save tke at before time step 
    218216      eb  (:,:,:) = en  (:,:,:) 
    219       mxlb(:,:,:) = mxln(:,:,:) 
     217      mxlb(:,:,:) = hmxn(:,:,:) 
    220218 
    221219      IF( nn_clos == 0 ) THEN    ! Mellor-Yamada 
     
    223221            DO jj = 2, jpjm1  
    224222               DO ji = fs_2, fs_jpim1   ! vector opt. 
    225                   zup   = mxln(ji,jj,jk) * gdepw_n(ji,jj,mbkt(ji,jj)+1) 
     223                  zup   = hmxn(ji,jj,jk) * gdepw_n(ji,jj,mbkt(ji,jj)+1) 
    226224                  zdown = vkarmn * gdepw_n(ji,jj,jk) * ( -gdepw_n(ji,jj,jk) + gdepw_n(ji,jj,mbkt(ji,jj)+1) ) 
    227225                  zcoef = ( zup / MAX( zdown, rsmall ) ) 
     
    247245      DO jk = 2, jpkm1 
    248246         DO jj = 2, jpjm1 
    249             DO ji = fs_2, fs_jpim1   ! vector opt. 
     247            DO ji = 2, jpim1 
    250248               ! 
    251249               ! shear prod. at w-point weightened by mask 
    252                shear(ji,jj,jk) =  ( avmu(ji-1,jj,jk) + avmu(ji,jj,jk) ) / MAX( 1.e0 , umask(ji-1,jj,jk) + umask(ji,jj,jk) )   & 
    253                   &             + ( avmv(ji,jj-1,jk) + avmv(ji,jj,jk) ) / MAX( 1.e0 , vmask(ji,jj-1,jk) + vmask(ji,jj,jk) ) 
     250               shear(ji,jj,jk) =  ( z3du(ji-1,jj,jk) + z3du(ji,jj,jk) ) / MAX( 1.e0 , umask(ji-1,jj,jk) + umask(ji,jj,jk) )   & 
     251                  &             + ( z3dv(ji,jj-1,jk) + z3dv(ji,jj,jk) ) / MAX( 1.e0 , vmask(ji,jj-1,jk) + vmask(ji,jj,jk) ) 
    254252               ! 
    255253               ! stratif. destruction 
     
    278276               ! building the matrix 
    279277               zcof = rfact_tke * tmask(ji,jj,jk) 
    280                ! 
    281                ! lower diagonal 
    282                z_elem_a(ji,jj,jk) = zcof * ( avm  (ji,jj,jk  ) + avm  (ji,jj,jk-1) )   & 
    283                   &                      / ( e3t_n(ji,jj,jk-1) * e3w_n(ji,jj,jk  ) ) 
    284                ! 
    285                ! upper diagonal 
    286                z_elem_c(ji,jj,jk) = zcof * ( avm  (ji,jj,jk+1) + avm  (ji,jj,jk  ) )   & 
    287                   &                      / ( e3t_n(ji,jj,jk  ) * e3w_n(ji,jj,jk) ) 
    288                ! 
    289                ! diagonal 
    290                z_elem_b(ji,jj,jk) = 1._wp - z_elem_a(ji,jj,jk) - z_elem_c(ji,jj,jk)  & 
    291                   &                       + rdt * zdiss * tmask(ji,jj,jk)  
    292                ! 
    293                ! right hand side in en 
    294                en(ji,jj,jk) = en(ji,jj,jk) + rdt * zesh2 * tmask(ji,jj,jk) 
     278               !                                               ! lower diagonal 
     279               z_elem_a(ji,jj,jk) = zcof * ( avm(ji,jj,jk  ) + avm(ji,jj,jk-1) ) / ( e3t_n(ji,jj,jk-1) * e3w_n(ji,jj,jk) ) 
     280               !                                               ! upper diagonal 
     281               z_elem_c(ji,jj,jk) = zcof * ( avm(ji,jj,jk+1) + avm(ji,jj,jk  ) ) / ( e3t_n(ji,jj,jk  ) * e3w_n(ji,jj,jk) ) 
     282               !                                               ! diagonal 
     283               z_elem_b(ji,jj,jk) = 1._wp - z_elem_a(ji,jj,jk) - z_elem_c(ji,jj,jk)  + rdt * zdiss * wmask(ji,jj,jk)  
     284               !                                               ! right hand side in en 
     285               en(ji,jj,jk) = en(ji,jj,jk) + rdt * zesh2 * wmask(ji,jj,jk) 
    295286            END DO 
    296287         END DO 
     
    300291      ! 
    301292      ! Set surface condition on zwall_psi (1 at the bottom) 
    302       zwall_psi(:,:,1) = zwall_psi(:,:,2) 
    303       zwall_psi(:,:,jpk) = 1. 
     293      zwall_psi(:,:, 1 ) = zwall_psi(:,:,2) 
     294      zwall_psi(:,:,jpk) = 1._wp 
    304295      ! 
    305296      ! Surface boundary condition on tke 
     
    353344      ! 
    354345      CASE ( 0 )             ! Dirichlet  
    355          !                      ! en(ibot) = u*^2 / Co2 and mxln(ibot) = rn_lmin 
     346         !                      ! en(ibot) = u*^2 / Co2 and hmxn(ibot) = rn_lmin 
    356347         !                      ! Balance between the production and the dissipation terms 
    357348         DO jj = 2, jpjm1 
     
    503494               ! building the matrix 
    504495               zcof = rfact_psi * zwall_psi(ji,jj,jk) * tmask(ji,jj,jk) 
    505                ! lower diagonal 
    506                z_elem_a(ji,jj,jk) = zcof * ( avm  (ji,jj,jk  ) + avm  (ji,jj,jk-1) )   & 
    507                   &                      / ( e3t_n(ji,jj,jk-1) * e3w_n(ji,jj,jk  ) ) 
    508                ! upper diagonal 
    509                z_elem_c(ji,jj,jk) = zcof * ( avm  (ji,jj,jk+1) + avm  (ji,jj,jk  ) )   & 
    510                   &                      / ( e3t_n(ji,jj,jk  ) * e3w_n(ji,jj,jk) ) 
    511                ! diagonal 
    512                z_elem_b(ji,jj,jk) = 1._wp - z_elem_a(ji,jj,jk) - z_elem_c(ji,jj,jk)  & 
    513                   &                       + rdt * zdiss * tmask(ji,jj,jk) 
    514                ! 
    515                ! right hand side in psi 
    516                psi(ji,jj,jk) = psi(ji,jj,jk) + rdt * zesh2 * tmask(ji,jj,jk) 
     496               !                                               ! lower diagonal 
     497               z_elem_a(ji,jj,jk) = zcof * ( avm(ji,jj,jk  ) + avm(ji,jj,jk-1) ) / ( e3t_n(ji,jj,jk-1) * e3w_n(ji,jj,jk) ) 
     498               !                                               ! upper diagonal 
     499               z_elem_c(ji,jj,jk) = zcof * ( avm(ji,jj,jk+1) + avm(ji,jj,jk  ) ) / ( e3t_n(ji,jj,jk  ) * e3w_n(ji,jj,jk) ) 
     500               !                                               ! diagonal 
     501               z_elem_b(ji,jj,jk) = 1._wp - z_elem_a(ji,jj,jk) - z_elem_c(ji,jj,jk) + rdt * zdiss * wmask(ji,jj,jk) 
     502               !                                               ! right hand side in psi 
     503               psi(ji,jj,jk) = psi(ji,jj,jk) + rdt * zesh2 * wmask(ji,jj,jk) 
    517504            END DO 
    518505         END DO 
     
    565552      zflxs(:,:) = zdep(:,:) * zflxs(:,:) 
    566553      psi(:,:,2) = psi(:,:,2) + zflxs(:,:) / e3w_n(:,:,2) 
    567  
    568554      !    
    569555      ! 
     
    577563      ! 
    578564      CASE ( 0 )             ! Dirichlet  
    579          !                      ! en(ibot) = u*^2 / Co2 and mxln(ibot) = vkarmn * rn_bfrz0 
     565         !                      ! en(ibot) = u*^2 / Co2 and hmxn(ibot) = vkarmn * rn_bfrz0 
    580566         !                      ! Balance between the production and the dissipation terms 
    581567         DO jj = 2, jpjm1 
     
    700686      ! Limit dissipation rate under stable stratification 
    701687      ! -------------------------------------------------- 
    702       DO jk = 1, jpkm1 ! Note that this set boundary conditions on mxln at the same time 
     688      DO jk = 1, jpkm1 ! Note that this set boundary conditions on hmxn at the same time 
    703689         DO jj = 2, jpjm1 
    704690            DO ji = fs_2, fs_jpim1    ! vector opt. 
    705691               ! limitation 
    706692               eps(ji,jj,jk)  = MAX( eps(ji,jj,jk), rn_epsmin ) 
    707                mxln(ji,jj,jk)  = rc03 * en(ji,jj,jk) * SQRT( en(ji,jj,jk) ) / eps(ji,jj,jk) 
     693               hmxn(ji,jj,jk)  = rc03 * en(ji,jj,jk) * SQRT( en(ji,jj,jk) ) / eps(ji,jj,jk) 
    708694               ! Galperin criterium (NOTE : Not required if the proper value of C3 in stable cases is calculated)  
    709695               zrn2 = MAX( rn2(ji,jj,jk), rsmall ) 
    710                IF (ln_length_lim) mxln(ji,jj,jk) = MIN(  rn_clim_galp * SQRT( 2._wp * en(ji,jj,jk) / zrn2 ), mxln(ji,jj,jk) ) 
     696               IF (ln_length_lim) hmxn(ji,jj,jk) = MIN(  rn_clim_galp * SQRT( 2._wp * en(ji,jj,jk) / zrn2 ), hmxn(ji,jj,jk) ) 
    711697            END DO 
    712698         END DO 
     
    733719                  sm = ( rb1**(-1._wp/3._wp) + ( 18._wp*ra1*ra1 + 9._wp*ra1*ra2*(1._wp-rc2) )*sh*gh ) / (1._wp-9._wp*ra1*ra2*gh) 
    734720                  ! 
    735                   ! Store stability function in avmu and avmv 
    736                   avmu(ji,jj,jk) = rc_diff * sh * tmask(ji,jj,jk) 
    737                   avmv(ji,jj,jk) = rc_diff * sm * tmask(ji,jj,jk) 
     721                  ! Store stability function in z3du and z3dv 
     722                  z3du(ji,jj,jk) = rc_diff * sh * tmask(ji,jj,jk) 
     723                  z3dv(ji,jj,jk) = rc_diff * sm * tmask(ji,jj,jk) 
    738724               END DO 
    739725            END DO 
     
    761747                  sh = (rs4 - rs5*gh + rs6*gm) / rcff 
    762748                  ! 
    763                   ! Store stability function in avmu and avmv 
    764                   avmu(ji,jj,jk) = rc_diff * sh * tmask(ji,jj,jk) 
    765                   avmv(ji,jj,jk) = rc_diff * sm * tmask(ji,jj,jk) 
     749                  ! Store stability function in z3du and z3dv 
     750                  z3du(ji,jj,jk) = rc_diff * sh * tmask(ji,jj,jk) 
     751                  z3dv(ji,jj,jk) = rc_diff * sm * tmask(ji,jj,jk) 
    766752               END DO 
    767753            END DO 
     
    773759      ! Lines below are useless if GOTM style Dirichlet conditions are used 
    774760 
    775       avmv(:,:,1) = avmv(:,:,2) 
     761      z3dv(:,:,1) = z3dv(:,:,2) 
    776762 
    777763      DO jj = 2, jpjm1 
    778764         DO ji = fs_2, fs_jpim1   ! vector opt. 
    779             avmv(ji,jj,mbkt(ji,jj)+1) = avmv(ji,jj,mbkt(ji,jj)) 
     765            z3dv(ji,jj,mbkt(ji,jj)+1) = z3dv(ji,jj,mbkt(ji,jj)) 
    780766         END DO 
    781767      END DO 
     
    786772         DO jj = 2, jpjm1 
    787773            DO ji = fs_2, fs_jpim1   ! vector opt. 
    788                zsqen         = SQRT( 2._wp * en(ji,jj,jk) ) * mxln(ji,jj,jk) 
    789                zav           = zsqen * avmu(ji,jj,jk) 
    790                avt(ji,jj,jk) = MAX( zav, avtb(jk) )*tmask(ji,jj,jk) ! apply mask for zdfmxl routine 
    791                zav           = zsqen * avmv(ji,jj,jk) 
    792                avm(ji,jj,jk) = MAX( zav, avmb(jk) ) ! Note that avm is not masked at the surface and the bottom 
     774               zsqen         = SQRT( 2._wp * en(ji,jj,jk) ) * hmxn(ji,jj,jk) 
     775               zav           = zsqen * z3du(ji,jj,jk) 
     776               avt(ji,jj,jk) = MAX( zav, avtb(jk) ) * wmask(ji,jj,jk) ! apply mask for zdfmxl routine 
     777               zav           = zsqen * z3dv(ji,jj,jk) 
     778               avm(ji,jj,jk) = MAX( zav, avmb(jk) )                   ! Note that avm is not masked at the surface and the bottom 
    793779            END DO 
    794780         END DO 
    795781      END DO 
    796       ! 
    797       ! Lateral boundary conditions (sign unchanged) 
    798782      avt(:,:,1)  = 0._wp 
     783!!gm I'm sure this is needed to compute the shear term at next time-step 
    799784      CALL lbc_lnk( avm, 'W', 1. )   ;   CALL lbc_lnk( avt, 'W', 1. ) 
    800  
    801       DO jk = 2, jpkm1            !* vertical eddy viscosity at u- and v-points 
    802          DO jj = 2, jpjm1 
    803             DO ji = fs_2, fs_jpim1   ! vector opt. 
    804                avmu(ji,jj,jk) = 0.5 * ( avm(ji,jj,jk) + avm(ji+1,jj  ,jk) ) * umask(ji,jj,jk) 
    805                avmv(ji,jj,jk) = 0.5 * ( avm(ji,jj,jk) + avm(ji  ,jj+1,jk) ) * vmask(ji,jj,jk) 
    806             END DO 
    807          END DO 
    808       END DO 
    809       avmu(:,:,1) = 0._wp             ;   avmv(:,:,1) = 0._wp                 ! set surface to zero 
    810       CALL lbc_lnk( avmu, 'U', 1. )   ;   CALL lbc_lnk( avmv, 'V', 1. )       ! Lateral boundary conditions 
    811  
     785      ! 
    812786      IF(ln_ctl) THEN 
    813          CALL prt_ctl( tab3d_1=en  , clinfo1=' gls  - e: ', tab3d_2=avt, clinfo2=' t: ', ovlap=1, kdim=jpk) 
    814          CALL prt_ctl( tab3d_1=avmu, clinfo1=' gls  - u: ', mask1=umask,                   & 
    815             &          tab3d_2=avmv, clinfo2=       ' v: ', mask2=vmask, ovlap=1, kdim=jpk ) 
     787         CALL prt_ctl( tab3d_1=en , clinfo1=' gls  - e: ', tab3d_2=avt, clinfo2=' t: ', ovlap=1, kdim=jpk) 
     788         CALL prt_ctl( tab3d_1=avm, clinfo1=' gls  - m: ', ovlap=1, kdim=jpk ) 
    816789      ENDIF 
    817790      ! 
    818       avt_k (:,:,:) = avt (:,:,:) 
    819       avm_k (:,:,:) = avm (:,:,:) 
    820       avmu_k(:,:,:) = avmu(:,:,:) 
    821       avmv_k(:,:,:) = avmv(:,:,:) 
     791      avt_k(:,:,:) = avt(:,:,:)      !==  store avt, avm values computed by GLS only  ==! 
     792      avm_k(:,:,:) = avm(:,:,:) 
     793      ! 
     794      IF( lrst_oce )   CALL gls_rst( kt, 'WRITE' )     ! write the GLS info in the restart file 
    822795      ! 
    823796      CALL wrk_dealloc( jpi,jpj,       zdep, zkar, zflxs, zhsro ) 
    824797      CALL wrk_dealloc( jpi,jpj,jpk,   eb, mxlb, shear, eps, zwall_psi, z_elem_a, z_elem_b, z_elem_c, psi ) 
    825       ! 
    826       IF( nn_timing == 1 )  CALL timing_stop('zdf_gls') 
    827       ! 
     798      CALL wrk_dealloc( jpi,jpj,jpk,   z3du, z3dv ) 
     799      ! 
     800      IF( nn_timing == 1 )   CALL timing_stop('zdf_gls') 
    828801      ! 
    829802   END SUBROUTINE zdf_gls 
     
    835808      !!                      
    836809      !! ** Purpose :   Initialization of the vertical eddy diffivity and  
    837       !!      viscosity when using a gls turbulent closure scheme 
     810      !!              viscosity computed using a GLS turbulent closure scheme 
    838811      !! 
    839812      !! ** Method  :   Read the namzdf_gls namelist and check the parameters 
    840       !!      called at the first timestep (nit000) 
    841813      !! 
    842814      !! ** input   :   Namlist namzdf_gls 
     
    892864      ENDIF 
    893865 
    894       !                                !* allocate gls arrays 
     866      !                                !* allocate GLS arrays 
    895867      IF( zdf_gls_alloc() /= 0 )   CALL ctl_stop( 'STOP', 'zdf_gls_init : unable to allocate arrays' ) 
    896868 
     
    11201092      rsbc_psi1 = -0.5_wp * rdt * rc0**(rpp-2._wp*rmm) / rsc_psi 
    11211093      rsbc_psi2 = -0.5_wp * rdt * rc0**rpp * rnn * vkarmn**rnn / rsc_psi ! Neumann + NO Wave breaking  
    1122  
     1094      ! 
    11231095      rfact_tke = -0.5_wp / rsc_tke * rdt                                ! Cst used for the Diffusion term of tke 
    11241096      rfact_psi = -0.5_wp / rsc_psi * rdt                                ! Cst used for the Diffusion term of tke 
    1125  
     1097      ! 
    11261098      !                                !* Wall proximity function 
    11271099      zwall (:,:,:) = 1._wp * tmask(:,:,:) 
    11281100 
    1129       !                                !* set vertical eddy coef. to the background value 
    1130       DO jk = 1, jpk 
    1131          avt (:,:,jk) = avtb(jk) * tmask(:,:,jk) 
    1132          avm (:,:,jk) = avmb(jk) * tmask(:,:,jk) 
    1133          avmu(:,:,jk) = avmb(jk) * umask(:,:,jk) 
    1134          avmv(:,:,jk) = avmb(jk) * vmask(:,:,jk) 
    1135       END DO 
    1136       !                               
    1137       CALL gls_rst( nit000, 'READ' )   !* read or initialize all required files 
     1101      !                                !* read or initialize all required files   
     1102      CALL gls_rst( nit000, 'READ' )      ! (en, avt_k, avm_k, hmxn) 
    11381103      ! 
    11391104      IF( nn_timing == 1 )  CALL timing_stop('zdf_gls_init') 
     
    11521117      !!                set to rn_emin or recomputed (nn_igls/=0) 
    11531118      !!---------------------------------------------------------------------- 
    1154       INTEGER         , INTENT(in) ::   kt         ! ocean time-step 
    1155       CHARACTER(len=*), INTENT(in) ::   cdrw       ! "READ"/"WRITE" flag 
     1119      INTEGER         , INTENT(in) ::   kt     ! ocean time-step 
     1120      CHARACTER(len=*), INTENT(in) ::   cdrw   ! "READ"/"WRITE" flag 
    11561121      ! 
    11571122      INTEGER ::   jit, jk   ! dummy loop indices 
    1158       INTEGER ::   id1, id2, id3, id4, id5, id6 
     1123      INTEGER ::   id1, id2, id3, id4 
    11591124      INTEGER ::   ji, jj, ikbu, ikbv 
    11601125      REAL(wp)::   cbx, cby 
     
    11651130         IF( ln_rstart ) THEN                   !* Read the restart file 
    11661131            id1 = iom_varid( numror, 'en'   , ldstop = .FALSE. ) 
    1167             id2 = iom_varid( numror, 'avt'  , ldstop = .FALSE. ) 
    1168             id3 = iom_varid( numror, 'avm'  , ldstop = .FALSE. ) 
    1169             id4 = iom_varid( numror, 'avmu' , ldstop = .FALSE. ) 
    1170             id5 = iom_varid( numror, 'avmv' , ldstop = .FALSE. ) 
    1171             id6 = iom_varid( numror, 'mxln' , ldstop = .FALSE. ) 
     1132            id2 = iom_varid( numror, 'avt_k', ldstop = .FALSE. ) 
     1133            id3 = iom_varid( numror, 'avm_k', ldstop = .FALSE. ) 
     1134            id4 = iom_varid( numror, 'hmxn' , ldstop = .FALSE. ) 
    11721135            ! 
    1173             IF( MIN( id1, id2, id3, id4, id5, id6 ) > 0 ) THEN        ! all required arrays exist 
    1174                CALL iom_get( numror, jpdom_autoglo, 'en'    , en     ) 
    1175                CALL iom_get( numror, jpdom_autoglo, 'avt'   , avt    ) 
    1176                CALL iom_get( numror, jpdom_autoglo, 'avm'   , avm    ) 
    1177                CALL iom_get( numror, jpdom_autoglo, 'avmu'  , avmu   ) 
    1178                CALL iom_get( numror, jpdom_autoglo, 'avmv'  , avmv   ) 
    1179                CALL iom_get( numror, jpdom_autoglo, 'mxln'  , mxln   ) 
     1136            IF( MIN( id1, id2, id3, id4 ) > 0 ) THEN        ! all required arrays exist 
     1137               CALL iom_get( numror, jpdom_autoglo, 'en'   , en    ) 
     1138               CALL iom_get( numror, jpdom_autoglo, 'avt_k', avt_k ) 
     1139               CALL iom_get( numror, jpdom_autoglo, 'avm_k', avm_k ) 
     1140               CALL iom_get( numror, jpdom_autoglo, 'hmxn' , hmxn  ) 
    11801141            ELSE                         
    1181                IF(lwp) WRITE(numout,*) ' ===>>>> : previous run without gls scheme, en and mxln computed by iterative loop' 
    1182                en  (:,:,:) = rn_emin 
    1183                mxln(:,:,:) = 0.05         
    1184                avt_k (:,:,:) = avt (:,:,:) 
    1185                avm_k (:,:,:) = avm (:,:,:) 
    1186                avmu_k(:,:,:) = avmu(:,:,:) 
    1187                avmv_k(:,:,:) = avmv(:,:,:) 
     1142               IF(lwp) WRITE(numout,*) ' ===>>>> : previous run without gls scheme, en and hmxn computed by iterative loop' 
     1143               en   (:,:,:) = rn_emin 
     1144               hmxn (:,:,:) = 0.05_wp 
     1145               avt_k(:,:,:) = avt(:,:,:) 
     1146               avm_k(:,:,:) = avm(:,:,:) 
    11881147               DO jit = nit000 + 1, nit000 + 10   ;   CALL zdf_gls( jit )   ;   END DO 
    11891148            ENDIF 
    11901149         ELSE                                   !* Start from rest 
    1191             IF(lwp) WRITE(numout,*) ' ===>>>> : Initialisation of en and mxln by background values' 
     1150            IF(lwp) WRITE(numout,*) ' ===>>>> : Initialisation of en and hmxn by background values' 
    11921151            en  (:,:,:) = rn_emin 
    1193             mxln(:,:,:) = 0.05        
     1152            hmxn(:,:,:) = 0.05_wp 
     1153            DO jk = 1, jpk 
     1154               avt_k(:,:,jk) = avtb(jk) * wmask(:,:,jk) 
     1155               avm_k(:,:,jk) = avmb(jk) * wmask(:,:,jk) 
     1156            END DO 
    11941157         ENDIF 
    11951158         ! 
     
    11971160         !                                   ! ------------------- 
    11981161         IF(lwp) WRITE(numout,*) '---- gls-rst ----' 
    1199          CALL iom_rstput( kt, nitrst, numrow, 'en'   , en     )  
    1200          CALL iom_rstput( kt, nitrst, numrow, 'avt'  , avt_k  ) 
    1201          CALL iom_rstput( kt, nitrst, numrow, 'avm'  , avm_k  ) 
    1202          CALL iom_rstput( kt, nitrst, numrow, 'avmu' , avmu_k )  
    1203          CALL iom_rstput( kt, nitrst, numrow, 'avmv' , avmv_k ) 
    1204          CALL iom_rstput( kt, nitrst, numrow, 'mxln' , mxln   ) 
     1162         CALL iom_rstput( kt, nitrst, numrow, 'en'   , en    )  
     1163         CALL iom_rstput( kt, nitrst, numrow, 'avt_k', avt_k ) 
     1164         CALL iom_rstput( kt, nitrst, numrow, 'avm_k', avm_k ) 
     1165         CALL iom_rstput( kt, nitrst, numrow, 'hmxn' , hmxn  ) 
    12051166         ! 
    12061167      ENDIF 
Note: See TracChangeset for help on using the changeset viewer.