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 15797 – NEMO

Changeset 15797


Ignore:
Timestamp:
2022-04-25T11:39:18+02:00 (2 years ago)
Author:
hadjt
Message:

Updating blankspace

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/UKMO/CO6_shelfclimate/NEMOGCM/NEMO/OPA_SRC/ZDF/zdfgls.F90

    r7566 r15797  
    22   !!====================================================================== 
    33   !!                       ***  MODULE  zdfgls  *** 
    4    !! Ocean physics:  vertical mixing coefficient computed from the gls  
     4   !! Ocean physics:  vertical mixing coefficient computed from the gls 
    55   !!                 turbulent closure parameterization 
    66   !!====================================================================== 
     
    1616   !!   gls_rst       : read/write gls restart in ocean restart file 
    1717   !!---------------------------------------------------------------------- 
    18    USE oce            ! ocean dynamics and active tracers  
     18   USE oce            ! ocean dynamics and active tracers 
    1919   USE dom_oce        ! ocean space and time domain 
    2020   USE domvvl         ! ocean space and time domain : variable volume layer 
     
    3131   USE iom            ! I/O manager library 
    3232   USE timing         ! Timing 
    33    USE lib_fortran    ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined)   
     33   USE lib_fortran    ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined) 
    3434 
    3535   IMPLICIT NONE 
     
    6161   REAL(wp) ::   rn_crban          ! Craig and Banner constant for surface breaking waves mixing 
    6262   REAL(wp) ::   rn_hsro           ! Minimum surface roughness 
    63    REAL(wp) ::   rn_frac_hs        ! Fraction of wave height as surface roughness (if nn_z0_met > 1)  
     63   REAL(wp) ::   rn_frac_hs        ! Fraction of wave height as surface roughness (if nn_z0_met > 1) 
    6464 
    6565   REAL(wp) ::   rcm_sf        =  0.73_wp     ! Shear free turbulence parameters 
    66    REAL(wp) ::   ra_sf         = -2.0_wp      ! Must be negative -2 < ra_sf < -1  
    67    REAL(wp) ::   rl_sf         =  0.2_wp      ! 0 <rl_sf<vkarmn     
     66   REAL(wp) ::   ra_sf         = -2.0_wp      ! Must be negative -2 < ra_sf < -1 
     67   REAL(wp) ::   rl_sf         =  0.2_wp      ! 0 <rl_sf<vkarmn 
    6868   REAL(wp) ::   rghmin        = -0.28_wp 
    6969   REAL(wp) ::   rgh0          =  0.0329_wp 
     
    7272   REAL(wp) ::   ra2           =  0.74_wp 
    7373   REAL(wp) ::   rb1           = 16.60_wp 
    74    REAL(wp) ::   rb2           = 10.10_wp          
    75    REAL(wp) ::   re2           =  1.33_wp          
     74   REAL(wp) ::   rb2           = 10.10_wp 
     75   REAL(wp) ::   re2           =  1.33_wp 
    7676   REAL(wp) ::   rl1           =  0.107_wp 
    7777   REAL(wp) ::   rl2           =  0.0032_wp 
     
    133133      INTEGER  ::   ji, jj, jk, ibot, ibotm1, dir  ! dummy loop arguments 
    134134      REAL(wp) ::   zesh2, zsigpsi, zcoef, zex1, zex2   ! local scalars 
    135       REAL(wp) ::   ztx2, zty2, zup, zdown, zcof        !   -      -  
     135      REAL(wp) ::   ztx2, zty2, zup, zdown, zcof        !   -      - 
    136136      REAL(wp) ::   zratio, zrn2, zflxb, sh             !   -      - 
    137137      REAL(wp) ::   prod, buoy, diss, zdiss, sm         !   -      - 
     
    139139      REAL(wp), POINTER, DIMENSION(:,:  ) ::   zdep 
    140140      REAL(wp), POINTER, DIMENSION(:,:  ) ::   zkar 
    141       REAL(wp), POINTER, DIMENSION(:,:  ) ::   zflxs       ! Turbulence fluxed induced by internal waves  
     141      REAL(wp), POINTER, DIMENSION(:,:  ) ::   zflxs       ! Turbulence fluxed induced by internal waves 
    142142      REAL(wp), POINTER, DIMENSION(:,:  ) ::   zhsro       ! Surface roughness (surface waves) 
    143143      REAL(wp), POINTER, DIMENSION(:,:,:) ::   eb          ! tke at time before 
     
    156156      CALL wrk_alloc( jpi,jpj, zdep, zkar, zflxs, zhsro ) 
    157157      CALL wrk_alloc( jpi,jpj,jpk, eb, mxlb, shear, eps, zwall_psi, z_elem_a, z_elem_b, z_elem_c, psi  ) 
    158        
     158 
    159159      ! Preliminary computing 
    160160 
     
    165165         avm (:,:,:) = avm_k (:,:,:) 
    166166         avmu(:,:,:) = avmu_k(:,:,:) 
    167          avmv(:,:,:) = avmv_k(:,:,:)  
     167         avmv(:,:,:) = avmv_k(:,:,:) 
    168168      ENDIF 
    169169 
    170170      ! Compute surface and bottom friction at T-points 
    171 !CDIR NOVERRCHK           
    172       DO jj = 2, jpjm1           
    173 !CDIR NOVERRCHK          
     171!CDIR NOVERRCHK 
     172      DO jj = 2, jpjm1 
     173!CDIR NOVERRCHK 
    174174         DO ji = fs_2, fs_jpim1   ! vector opt.          
    175175            ! 
    176176            ! surface friction 
    177177            ustars2(ji,jj) = r1_rau0 * taum(ji,jj) * tmask(ji,jj,1) 
    178             !    
    179             ! bottom friction (explicit before friction)         
    180             ! Note that we chose here not to bound the friction as in dynbfr)    
    181             ztx2 = (  bfrua(ji,jj)  * ub(ji,jj,mbku(ji,jj)) + bfrua(ji-1,jj) * ub(ji-1,jj,mbku(ji-1,jj))  )   &          
    182                & * ( 1._wp - 0.5_wp * umask(ji,jj,1) * umask(ji-1,jj,1)  )       
    183             zty2 = (  bfrva(ji,jj)  * vb(ji,jj,mbkv(ji,jj)) + bfrva(ji,jj-1) * vb(ji,jj-1,mbkv(ji,jj-1))  )   &          
    184                & * ( 1._wp - 0.5_wp * vmask(ji,jj,1) * vmask(ji,jj-1,1)  )       
    185             ustarb2(ji,jj) = SQRT( ztx2 * ztx2 + zty2 * zty2 ) * tmask(ji,jj,1)          
    186          END DO          
    187       END DO     
     178            ! 
     179            ! bottom friction (explicit before friction) 
     180            ! Note that we chose here not to bound the friction as in dynbfr) 
     181            ztx2 = (  bfrua(ji,jj)  * ub(ji,jj,mbku(ji,jj)) + bfrua(ji-1,jj) * ub(ji-1,jj,mbku(ji-1,jj))  )   & 
     182               & * ( 1._wp - 0.5_wp * umask(ji,jj,1) * umask(ji-1,jj,1)  ) 
     183            zty2 = (  bfrva(ji,jj)  * vb(ji,jj,mbkv(ji,jj)) + bfrva(ji,jj-1) * vb(ji,jj-1,mbkv(ji,jj-1))  )   & 
     184               & * ( 1._wp - 0.5_wp * vmask(ji,jj,1) * vmask(ji,jj-1,1)  ) 
     185            ustarb2(ji,jj) = SQRT( ztx2 * ztx2 + zty2 * zty2 ) * tmask(ji,jj,1) 
     186         END DO 
     187      END DO 
    188188 
    189189      ! Set surface roughness length 
    190190      SELECT CASE ( nn_z0_met ) 
    191191      ! 
    192       CASE ( 0 )             ! Constant roughness           
     192      CASE ( 0 )             ! Constant roughness 
    193193         zhsro(:,:) = rn_hsro 
    194194      CASE ( 1 )             ! Standard Charnock formula 
     
    226226      IF( nn_clos == 0 ) THEN    ! Mellor-Yamada 
    227227         DO jk = 2, jpkm1 
    228             DO jj = 2, jpjm1  
     228            DO jj = 2, jpjm1 
    229229               DO ji = fs_2, fs_jpim1   ! vector opt. 
    230230                  zup   = mxln(ji,jj,jk) * fsdepw(ji,jj,mbkt(ji,jj)+1) 
     
    275275               IF( ln_sigpsi ) THEN 
    276276                  zsigpsi = MIN( 1._wp, zesh2 / eps(ji,jj,jk) )     ! 0. <= zsigpsi <= 1. 
    277                   zwall_psi(ji,jj,jk) = rsc_psi /   &  
     277                  zwall_psi(ji,jj,jk) = rsc_psi /   & 
    278278                     &     (  zsigpsi * rsc_psi + (1._wp-zsigpsi) * rsc_psi0 / MAX( zwall(ji,jj,jk), 1._wp )  ) 
    279279               ELSE 
     
    294294               ! diagonal 
    295295               z_elem_b(ji,jj,jk) = 1._wp - z_elem_a(ji,jj,jk) - z_elem_c(ji,jj,jk)  & 
    296                   &                       + rdt * zdiss * tmask(ji,jj,jk)  
     296                  &                       + rdt * zdiss * tmask(ji,jj,jk) 
    297297               ! 
    298298               ! right hand side in en 
     
    316316      ! First level 
    317317      en(:,:,1) = rc02r * ustars2(:,:) * (1._wp + rsbc_tke1)**(2._wp/3._wp) 
    318       en(:,:,1) = MAX(en(:,:,1), rn_emin)  
     318      en(:,:,1) = MAX(en(:,:,1), rn_emin) 
    319319      z_elem_a(:,:,1) = en(:,:,1) 
    320320      z_elem_c(:,:,1) = 0._wp 
    321321      z_elem_b(:,:,1) = 1._wp 
    322       !  
     322      ! 
    323323      ! One level below 
    324324      en(:,:,2) = rc02r * ustars2(:,:) * (1._wp + rsbc_tke1 * ((zhsro(:,:)+fsdepw(:,:,2)) & 
    325325          &            / zhsro(:,:) )**(1.5_wp*ra_sf))**(2._wp/3._wp) 
    326326      en(:,:,2) = MAX(en(:,:,2), rn_emin ) 
    327       z_elem_a(:,:,2) = 0._wp  
     327      z_elem_a(:,:,2) = 0._wp 
    328328      z_elem_c(:,:,2) = 0._wp 
    329329      z_elem_b(:,:,2) = 1._wp 
     
    334334      ! Dirichlet conditions at k=1 
    335335      en(:,:,1)       = rc02r * ustars2(:,:) * (1._wp + rsbc_tke1)**(2._wp/3._wp) 
    336       en(:,:,1)       = MAX(en(:,:,1), rn_emin)       
     336      en(:,:,1)       = MAX(en(:,:,1), rn_emin) 
    337337      z_elem_a(:,:,1) = en(:,:,1) 
    338338      z_elem_c(:,:,1) = 0._wp 
     
    357357      SELECT CASE ( nn_bc_bot ) 
    358358      ! 
    359       CASE ( 0 )             ! Dirichlet  
     359      CASE ( 0 )             ! Dirichlet 
    360360         !                      ! en(ibot) = u*^2 / Co2 and mxln(ibot) = rn_lmin 
    361361         !                      ! Balance between the production and the dissipation terms 
     
    377377               z_elem_c(ji,jj,ibotm1) = 0._wp 
    378378               z_elem_b(ji,jj,ibotm1) = 1._wp 
    379                en(ji,jj,ibotm1) = MAX( rc02r * ustarb2(ji,jj), rn_emin )  
     379               en(ji,jj,ibotm1) = MAX( rc02r * ustarb2(ji,jj), rn_emin ) 
    380380            END DO 
    381381         END DO 
    382382         ! 
    383383      CASE ( 1 )             ! Neumman boundary condition 
    384          !                       
     384         ! 
    385385!CDIR NOVERRCHK 
    386386         DO jj = 2, jpjm1 
     
    428428         END DO 
    429429      END DO 
    430       !                                            ! set the minimum value of tke  
     430      !                                            ! set the minimum value of tke 
    431431      en(:,:,:) = MAX( en(:,:,:), rn_emin ) 
    432432 
     
    470470            DO jj = 2, jpjm1 
    471471               DO ji = fs_2, fs_jpim1   ! vector opt. 
    472                   psi(ji,jj,jk)  = rc02 * eb(ji,jj,jk) * mxlb(ji,jj,jk)**rnn  
     472                  psi(ji,jj,jk)  = rc02 * eb(ji,jj,jk) * mxlb(ji,jj,jk)**rnn 
    473473               END DO 
    474474            END DO 
     
    489489               ! 
    490490               ! psi / k 
    491                zratio = psi(ji,jj,jk) / eb(ji,jj,jk)  
     491               zratio = psi(ji,jj,jk) / eb(ji,jj,jk) 
    492492               ! 
    493493               ! psi3+ : stable : B=-KhN²<0 => N²>0 if rn2>0 dir = 1 (stable) otherwise dir = 0 (unstable) 
     
    509509               zesh2 = dir * ( prod + buoy )          + (1._wp - dir ) * prod                        ! production term 
    510510               zdiss = dir * ( diss / psi(ji,jj,jk) ) + (1._wp - dir ) * (diss-buoy) / psi(ji,jj,jk) ! dissipation term 
    511                !                                                         
     511               ! 
    512512               ! building the matrix 
    513513               zcof = rfact_psi * zwall_psi(ji,jj,jk) * tmask(ji,jj,jk) 
     
    551551      z_elem_c(:,:,2) = 0._wp 
    552552      z_elem_b(:,:,2) = 1._wp 
    553       !  
     553      ! 
    554554      ! 
    555555      CASE ( 1 )             ! Neumann boundary condition on d(psi)/dz 
     
    575575      psi(:,:,2) = psi(:,:,2) + zflxs(:,:) / fse3w(:,:,2) 
    576576 
    577       !    
     577      ! 
    578578      ! 
    579579      END SELECT 
     
    585585      ! 
    586586      ! 
    587       CASE ( 0 )             ! Dirichlet  
     587      CASE ( 0 )             ! Dirichlet 
    588588         !                      ! en(ibot) = u*^2 / Co2 and mxln(ibot) = vkarmn * rn_bfrz0 
    589589         !                      ! Balance between the production and the dissipation terms 
     
    610610         ! 
    611611      CASE ( 1 )             ! Neumman boundary condition 
    612          !                       
     612         ! 
    613613!CDIR NOVERRCHK 
    614614         DO jj = 2, jpjm1 
     
    692692            DO jj = 2, jpjm1 
    693693               DO ji = fs_2, fs_jpim1   ! vector opt. 
    694                   eps(ji,jj,jk) = rc04 * en(ji,jj,jk) * psi(ji,jj,jk)  
     694                  eps(ji,jj,jk) = rc04 * en(ji,jj,jk) * psi(ji,jj,jk) 
    695695               END DO 
    696696            END DO 
     
    719719               eps(ji,jj,jk)  = MAX( eps(ji,jj,jk), rn_epsmin ) 
    720720               mxln(ji,jj,jk)  = rc03 * en(ji,jj,jk) * SQRT( en(ji,jj,jk) ) / eps(ji,jj,jk) 
    721                ! Galperin criterium (NOTE : Not required if the proper value of C3 in stable cases is calculated)  
     721               ! Galperin criterium (NOTE : Not required if the proper value of C3 in stable cases is calculated) 
    722722               zrn2 = MAX( rn2(ji,jj,jk), rsmall ) 
    723723               IF (ln_length_lim) mxln(ji,jj,jk) = MIN(  rn_clim_galp * SQRT( 2._wp * en(ji,jj,jk) / zrn2 ), mxln(ji,jj,jk) ) 
    724724            END DO 
    725725         END DO 
    726       END DO  
     726      END DO 
    727727 
    728728      ! 
     
    846846      !!---------------------------------------------------------------------- 
    847847      !!                  ***  ROUTINE zdf_gls_init  *** 
    848       !!                      
    849       !! ** Purpose :   Initialization of the vertical eddy diffivity and  
     848      !! 
     849      !! ** Purpose :   Initialization of the vertical eddy diffivity and 
    850850      !!      viscosity when using a gls turbulent closure scheme 
    851851      !! 
     
    10661066         ! 
    10671067      END SELECT 
    1068      
     1068 
    10691069      !                                !* Set Schmidt number for psi diffusion in the wave breaking case 
    10701070      !                                     ! See Eq. (13) of Carniel et al, OM, 30, 225-239, 2009 
    10711071      !                                     !  or Eq. (17) of Burchard, JPO, 31, 3133-3145, 2001 
    10721072      IF( ln_sigpsi ) THEN 
    1073          ra_sf = -1.5 ! Set kinetic energy slope, then deduce rsc_psi and rl_sf  
     1073         ra_sf = -1.5 ! Set kinetic energy slope, then deduce rsc_psi and rl_sf 
    10741074         ! Verification: retrieve Burchard (2001) results by uncomenting the line below: 
    10751075         ! Note that the results depend on the value of rn_cm_sf which is constant (=rc0) in his work 
     
    10791079         rsc_psi0 = rsc_psi 
    10801080      ENDIF 
    1081   
     1081 
    10821082      !                                !* Shear free turbulence parameters 
    10831083      ! 
     
    11251125      rc04  = rc03 * rc0 
    11261126      rsbc_tke1 = -3._wp/2._wp*rn_crban*ra_sf*rl_sf                      ! Dirichlet + Wave breaking 
    1127       rsbc_tke2 = rdt * rn_crban / rl_sf                                 ! Neumann + Wave breaking  
     1127      rsbc_tke2 = rdt * rn_crban / rl_sf                                 ! Neumann + Wave breaking 
    11281128      zcr = MAX(rsmall, rsbc_tke1**(1./(-ra_sf*3._wp/2._wp))-1._wp ) 
    1129       rtrans = 0.2_wp / zcr                                              ! Ad. inverse transition length between log and wave layer  
     1129      rtrans = 0.2_wp / zcr                                              ! Ad. inverse transition length between log and wave layer 
    11301130      rsbc_zs1  = rn_charn/grav                                          ! Charnock formula for surface roughness 
    1131       rsbc_zs2  = rn_frac_hs / 0.85_wp / grav * 665._wp                  ! Rascle formula for surface roughness  
     1131      rsbc_zs2  = rn_frac_hs / 0.85_wp / grav * 665._wp                  ! Rascle formula for surface roughness 
    11321132      rsbc_psi1 = -0.5_wp * rdt * rc0**(rpp-2._wp*rmm) / rsc_psi 
    1133       rsbc_psi2 = -0.5_wp * rdt * rc0**rpp * rnn * vkarmn**rnn / rsc_psi ! Neumann + NO Wave breaking  
     1133      rsbc_psi2 = -0.5_wp * rdt * rc0**rpp * rnn * vkarmn**rnn / rsc_psi ! Neumann + NO Wave breaking 
    11341134 
    11351135      rfact_tke = -0.5_wp / rsc_tke * rdt                                ! Cst used for the Diffusion term of tke 
     
    11461146         avmv(:,:,jk) = avmb(jk) * vmask(:,:,jk) 
    11471147      END DO 
    1148       !                               
     1148      ! 
    11491149      CALL gls_rst( nit000, 'READ' )   !* read or initialize all required files 
    11501150      ! 
     
    11571157      !!--------------------------------------------------------------------- 
    11581158      !!                   ***  ROUTINE ts_rst  *** 
    1159       !!                      
     1159      !! 
    11601160      !! ** Purpose :   Read or write TKE file (en) in restart file 
    11611161      !! 
    11621162      !! ** Method  :   use of IOM library 
    1163       !!                if the restart does not contain TKE, en is either  
     1163      !!                if the restart does not contain TKE, en is either 
    11641164      !!                set to rn_emin or recomputed (nn_igls/=0) 
    11651165      !!---------------------------------------------------------------------- 
     
    11731173      !!---------------------------------------------------------------------- 
    11741174      ! 
    1175       IF( TRIM(cdrw) == 'READ' ) THEN        ! Read/initialise  
     1175      IF( TRIM(cdrw) == 'READ' ) THEN        ! Read/initialise 
    11761176         !                                   ! --------------- 
    11771177         IF( ln_rstart ) THEN                   !* Read the restart file 
     
    11901190               CALL iom_get( numror, jpdom_autoglo, 'avmv'  , avmv   ) 
    11911191               CALL iom_get( numror, jpdom_autoglo, 'mxln'  , mxln   ) 
    1192             ELSE                         
     1192            ELSE 
    11931193               IF(lwp) WRITE(numout,*) ' ===>>>> : previous run without gls scheme, en and mxln computed by iterative loop' 
    11941194               en  (:,:,:) = rn_emin 
    1195                mxln(:,:,:) = 0.05         
     1195               mxln(:,:,:) = 0.05 
    11961196               avt_k (:,:,:) = avt (:,:,:) 
    11971197               avm_k (:,:,:) = avm (:,:,:) 
     
    12031203            IF(lwp) WRITE(numout,*) ' ===>>>> : Initialisation of en and mxln by background values' 
    12041204            en  (:,:,:) = rn_emin 
    1205             mxln(:,:,:) = 0.05        
     1205            mxln(:,:,:) = 0.05 
    12061206         ENDIF 
    12071207         ! 
     
    12091209         !                                   ! ------------------- 
    12101210         IF(lwp) WRITE(numout,*) '---- gls-rst ----' 
    1211          CALL iom_rstput( kt, nitrst, numrow, 'en'   , en     )  
     1211         CALL iom_rstput( kt, nitrst, numrow, 'en'   , en     ) 
    12121212         CALL iom_rstput( kt, nitrst, numrow, 'avt'  , avt_k  ) 
    12131213         CALL iom_rstput( kt, nitrst, numrow, 'avm'  , avm_k  ) 
    1214          CALL iom_rstput( kt, nitrst, numrow, 'avmu' , avmu_k )  
     1214         CALL iom_rstput( kt, nitrst, numrow, 'avmu' , avmu_k ) 
    12151215         CALL iom_rstput( kt, nitrst, numrow, 'avmv' , avmv_k ) 
    12161216         CALL iom_rstput( kt, nitrst, numrow, 'mxln' , mxln   ) 
     
    12411241   !!====================================================================== 
    12421242END MODULE zdfgls 
    1243  
Note: See TracChangeset for help on using the changeset viewer.