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 13088 for branches/UKMO/dev_1d_bugfixes/NEMOGCM/NEMO/OPA_SRC/ZDF/zdfgls.F90 – NEMO

Ignore:
Timestamp:
2020-06-10T13:13:39+02:00 (4 years ago)
Author:
jwhile
Message:

Bug fixes for 1D running

File:
1 edited

Legend:

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

    r11442 r13088  
    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   USE stopack 
    3535 
     
    6262   REAL(wp) ::   rn_crban          ! Craig and Banner constant for surface breaking waves mixing 
    6363   REAL(wp) ::   rn_hsro           ! Minimum surface roughness 
    64    REAL(wp) ::   rn_frac_hs        ! Fraction of wave height as surface roughness (if nn_z0_met > 1)  
     64   REAL(wp) ::   rn_frac_hs        ! Fraction of wave height as surface roughness (if nn_z0_met > 1) 
    6565 
    6666   REAL(wp) ::   rcm_sf        =  0.73_wp     ! Shear free turbulence parameters 
    67    REAL(wp) ::   ra_sf         = -2.0_wp      ! Must be negative -2 < ra_sf < -1  
    68    REAL(wp) ::   rl_sf         =  0.2_wp      ! 0 <rl_sf<vkarmn     
     67   REAL(wp) ::   ra_sf         = -2.0_wp      ! Must be negative -2 < ra_sf < -1 
     68   REAL(wp) ::   rl_sf         =  0.2_wp      ! 0 <rl_sf<vkarmn 
    6969   REAL(wp) ::   rghmin        = -0.28_wp 
    7070   REAL(wp) ::   rgh0          =  0.0329_wp 
     
    7373   REAL(wp) ::   ra2           =  0.74_wp 
    7474   REAL(wp) ::   rb1           = 16.60_wp 
    75    REAL(wp) ::   rb2           = 10.10_wp          
    76    REAL(wp) ::   re2           =  1.33_wp          
     75   REAL(wp) ::   rb2           = 10.10_wp 
     76   REAL(wp) ::   re2           =  1.33_wp 
    7777   REAL(wp) ::   rl1           =  0.107_wp 
    7878   REAL(wp) ::   rl2           =  0.0032_wp 
     
    134134      INTEGER  ::   ji, jj, jk, ibot, ibotm1, dir  ! dummy loop arguments 
    135135      REAL(wp) ::   zesh2, zsigpsi, zcoef, zex1, zex2   ! local scalars 
    136       REAL(wp) ::   ztx2, zty2, zup, zdown, zcof        !   -      -  
     136      REAL(wp) ::   ztx2, zty2, zup, zdown, zcof        !   -      - 
    137137      REAL(wp) ::   zratio, zrn2, zflxb, sh             !   -      - 
    138138      REAL(wp) ::   prod, buoy, diss, zdiss, sm         !   -      - 
     
    140140      REAL(wp), POINTER, DIMENSION(:,:  ) ::   zdep 
    141141      REAL(wp), POINTER, DIMENSION(:,:  ) ::   zkar 
    142       REAL(wp), POINTER, DIMENSION(:,:  ) ::   zflxs       ! Turbulence fluxed induced by internal waves  
     142      REAL(wp), POINTER, DIMENSION(:,:  ) ::   zflxs       ! Turbulence fluxed induced by internal waves 
    143143      REAL(wp), POINTER, DIMENSION(:,:  ) ::   zhsro       ! Surface roughness (surface waves) 
    144144      REAL(wp), POINTER, DIMENSION(:,:,:) ::   eb          ! tke at time before 
     
    157157      CALL wrk_alloc( jpi,jpj, zdep, zkar, zflxs, zhsro ) 
    158158      CALL wrk_alloc( jpi,jpj,jpk, eb, mxlb, shear, eps, zwall_psi, z_elem_a, z_elem_b, z_elem_c, psi  ) 
    159        
     159 
    160160      ! Preliminary computing 
    161161 
     
    166166         avm (:,:,:) = avm_k (:,:,:) 
    167167         avmu(:,:,:) = avmu_k(:,:,:) 
    168          avmv(:,:,:) = avmv_k(:,:,:)  
     168         avmv(:,:,:) = avmv_k(:,:,:) 
    169169      ENDIF 
    170170 
    171171      ! Compute surface and bottom friction at T-points 
    172 !CDIR NOVERRCHK           
    173       DO jj = 2, jpjm1           
    174 !CDIR NOVERRCHK          
    175          DO ji = fs_2, fs_jpim1   ! vector opt.          
     172!CDIR NOVERRCHK 
     173      DO jj = 2, jpjm1 
     174!CDIR NOVERRCHK 
     175         DO ji = fs_2, fs_jpim1   ! vector opt. 
    176176            ! 
    177177            ! surface friction 
    178178            ustars2(ji,jj) = r1_rau0 * taum(ji,jj) * tmask(ji,jj,1) 
    179             !    
    180             ! bottom friction (explicit before friction)         
    181             ! Note that we chose here not to bound the friction as in dynbfr)    
    182             ztx2 = (  bfrua(ji,jj)  * ub(ji,jj,mbku(ji,jj)) + bfrua(ji-1,jj) * ub(ji-1,jj,mbku(ji-1,jj))  )   &          
    183                & * ( 1._wp - 0.5_wp * umask(ji,jj,1) * umask(ji-1,jj,1)  )       
    184             zty2 = (  bfrva(ji,jj)  * vb(ji,jj,mbkv(ji,jj)) + bfrva(ji,jj-1) * vb(ji,jj-1,mbkv(ji,jj-1))  )   &          
    185                & * ( 1._wp - 0.5_wp * vmask(ji,jj,1) * vmask(ji,jj-1,1)  )       
    186             ustarb2(ji,jj) = SQRT( ztx2 * ztx2 + zty2 * zty2 ) * tmask(ji,jj,1)          
    187          END DO          
    188       END DO     
     179            ! 
     180            ! bottom friction (explicit before friction) 
     181            ! Note that we chose here not to bound the friction as in dynbfr) 
     182            ztx2 = (  bfrua(ji,jj)  * ub(ji,jj,mbku(ji,jj)) + bfrua(ji-1,jj) * ub(ji-1,jj,mbku(ji-1,jj))  )   & 
     183               & * ( 1._wp - 0.5_wp * umask(ji,jj,1) * umask(ji-1,jj,1)  ) 
     184            zty2 = (  bfrva(ji,jj)  * vb(ji,jj,mbkv(ji,jj)) + bfrva(ji,jj-1) * vb(ji,jj-1,mbkv(ji,jj-1))  )   & 
     185               & * ( 1._wp - 0.5_wp * vmask(ji,jj,1) * vmask(ji,jj-1,1)  ) 
     186            ustarb2(ji,jj) = SQRT( ztx2 * ztx2 + zty2 * zty2 ) * tmask(ji,jj,1) 
     187         END DO 
     188      END DO 
    189189 
    190190      ! Set surface roughness length 
    191191      SELECT CASE ( nn_z0_met ) 
    192192      ! 
    193       CASE ( 0 )             ! Constant roughness           
     193      CASE ( 0 )             ! Constant roughness 
    194194         zhsro(:,:) = rn_hsro 
    195195      CASE ( 1 )             ! Standard Charnock formula 
     
    227227      IF( nn_clos == 0 ) THEN    ! Mellor-Yamada 
    228228         DO jk = 2, jpkm1 
    229             DO jj = 2, jpjm1  
     229            DO jj = 2, jpjm1 
    230230               DO ji = fs_2, fs_jpim1   ! vector opt. 
    231231                  zup   = mxln(ji,jj,jk) * fsdepw(ji,jj,mbkt(ji,jj)+1) 
     
    276276               IF( ln_sigpsi ) THEN 
    277277                  zsigpsi = MIN( 1._wp, zesh2 / eps(ji,jj,jk) )     ! 0. <= zsigpsi <= 1. 
    278                   zwall_psi(ji,jj,jk) = rsc_psi /   &  
     278                  zwall_psi(ji,jj,jk) = rsc_psi /   & 
    279279                     &     (  zsigpsi * rsc_psi + (1._wp-zsigpsi) * rsc_psi0 / MAX( zwall(ji,jj,jk), 1._wp )  ) 
    280280               ELSE 
     
    295295               ! diagonal 
    296296               z_elem_b(ji,jj,jk) = 1._wp - z_elem_a(ji,jj,jk) - z_elem_c(ji,jj,jk)  & 
    297                   &                       + rdt * zdiss * tmask(ji,jj,jk)  
     297                  &                       + rdt * zdiss * tmask(ji,jj,jk) 
    298298               ! 
    299299               ! right hand side in en 
     
    317317      ! First level 
    318318      en(:,:,1) = rc02r * ustars2(:,:) * (1._wp + rsbc_tke1)**(2._wp/3._wp) 
    319       en(:,:,1) = MAX(en(:,:,1), rn_emin)  
     319      en(:,:,1) = MAX(en(:,:,1), rn_emin) 
    320320      z_elem_a(:,:,1) = en(:,:,1) 
    321321      z_elem_c(:,:,1) = 0._wp 
    322322      z_elem_b(:,:,1) = 1._wp 
    323       !  
     323      ! 
    324324      ! One level below 
    325325      en(:,:,2) = rc02r * ustars2(:,:) * (1._wp + rsbc_tke1 * ((zhsro(:,:)+fsdepw(:,:,2)) & 
    326326          &            / zhsro(:,:) )**(1.5_wp*ra_sf))**(2._wp/3._wp) 
    327327      en(:,:,2) = MAX(en(:,:,2), rn_emin ) 
    328       z_elem_a(:,:,2) = 0._wp  
     328      z_elem_a(:,:,2) = 0._wp 
    329329      z_elem_c(:,:,2) = 0._wp 
    330330      z_elem_b(:,:,2) = 1._wp 
     
    335335      ! Dirichlet conditions at k=1 
    336336      en(:,:,1)       = rc02r * ustars2(:,:) * (1._wp + rsbc_tke1)**(2._wp/3._wp) 
    337       en(:,:,1)       = MAX(en(:,:,1), rn_emin)       
     337      en(:,:,1)       = MAX(en(:,:,1), rn_emin) 
    338338      z_elem_a(:,:,1) = en(:,:,1) 
    339339      z_elem_c(:,:,1) = 0._wp 
     
    358358      SELECT CASE ( nn_bc_bot ) 
    359359      ! 
    360       CASE ( 0 )             ! Dirichlet  
     360      CASE ( 0 )             ! Dirichlet 
    361361         !                      ! en(ibot) = u*^2 / Co2 and mxln(ibot) = rn_lmin 
    362362         !                      ! Balance between the production and the dissipation terms 
     
    378378               z_elem_c(ji,jj,ibotm1) = 0._wp 
    379379               z_elem_b(ji,jj,ibotm1) = 1._wp 
    380                en(ji,jj,ibotm1) = MAX( rc02r * ustarb2(ji,jj), rn_emin )  
     380               en(ji,jj,ibotm1) = MAX( rc02r * ustarb2(ji,jj), rn_emin ) 
    381381            END DO 
    382382         END DO 
    383383         ! 
    384384      CASE ( 1 )             ! Neumman boundary condition 
    385          !                       
     385         ! 
    386386!CDIR NOVERRCHK 
    387387         DO jj = 2, jpjm1 
     
    429429         END DO 
    430430      END DO 
    431       !                                            ! set the minimum value of tke  
     431      !                                            ! set the minimum value of tke 
    432432      en(:,:,:) = MAX( en(:,:,:), rn_emin ) 
    433433 
     
    471471            DO jj = 2, jpjm1 
    472472               DO ji = fs_2, fs_jpim1   ! vector opt. 
    473                   psi(ji,jj,jk)  = rc02 * eb(ji,jj,jk) * mxlb(ji,jj,jk)**rnn  
     473                  psi(ji,jj,jk)  = rc02 * eb(ji,jj,jk) * mxlb(ji,jj,jk)**rnn 
    474474               END DO 
    475475            END DO 
     
    490490               ! 
    491491               ! psi / k 
    492                zratio = psi(ji,jj,jk) / eb(ji,jj,jk)  
     492               zratio = psi(ji,jj,jk) / eb(ji,jj,jk) 
    493493               ! 
    494494               ! psi3+ : stable : B=-KhN²<0 => N²>0 if rn2>0 dir = 1 (stable) otherwise dir = 0 (unstable) 
     
    510510               zesh2 = dir * ( prod + buoy )          + (1._wp - dir ) * prod                        ! production term 
    511511               zdiss = dir * ( diss / psi(ji,jj,jk) ) + (1._wp - dir ) * (diss-buoy) / psi(ji,jj,jk) ! dissipation term 
    512                !                                                         
     512               ! 
    513513               ! building the matrix 
    514514               zcof = rfact_psi * zwall_psi(ji,jj,jk) * tmask(ji,jj,jk) 
     
    552552      z_elem_c(:,:,2) = 0._wp 
    553553      z_elem_b(:,:,2) = 1._wp 
    554       !  
     554      ! 
    555555      ! 
    556556      CASE ( 1 )             ! Neumann boundary condition on d(psi)/dz 
     
    576576      psi(:,:,2) = psi(:,:,2) + zflxs(:,:) / fse3w(:,:,2) 
    577577 
    578       !    
     578      ! 
    579579      ! 
    580580      END SELECT 
     
    586586      ! 
    587587      ! 
    588       CASE ( 0 )             ! Dirichlet  
     588      CASE ( 0 )             ! Dirichlet 
    589589         !                      ! en(ibot) = u*^2 / Co2 and mxln(ibot) = vkarmn * rn_bfrz0 
    590590         !                      ! Balance between the production and the dissipation terms 
     
    611611         ! 
    612612      CASE ( 1 )             ! Neumman boundary condition 
    613          !                       
     613         ! 
    614614!CDIR NOVERRCHK 
    615615         DO jj = 2, jpjm1 
     
    693693            DO jj = 2, jpjm1 
    694694               DO ji = fs_2, fs_jpim1   ! vector opt. 
    695                   eps(ji,jj,jk) = rc04 * en(ji,jj,jk) * psi(ji,jj,jk)  
     695                  eps(ji,jj,jk) = rc04 * en(ji,jj,jk) * psi(ji,jj,jk) 
    696696               END DO 
    697697            END DO 
     
    720720               eps(ji,jj,jk)  = MAX( eps(ji,jj,jk), rn_epsmin ) 
    721721               mxln(ji,jj,jk)  = rc03 * en(ji,jj,jk) * SQRT( en(ji,jj,jk) ) / eps(ji,jj,jk) 
    722                ! Galperin criterium (NOTE : Not required if the proper value of C3 in stable cases is calculated)  
     722               ! Galperin criterium (NOTE : Not required if the proper value of C3 in stable cases is calculated) 
    723723               zrn2 = MAX( rn2(ji,jj,jk), rsmall ) 
    724724               IF (ln_length_lim) mxln(ji,jj,jk) = MIN(  rn_clim_galp * SQRT( 2._wp * en(ji,jj,jk) / zrn2 ), mxln(ji,jj,jk) ) 
    725725            END DO 
    726726         END DO 
    727       END DO  
     727      END DO 
    728728 
    729729      ! 
     
    807807            END DO 
    808808         END DO 
     809#if defined key_traldf_c2d || key_traldf_c3d 
    809810         IF( ln_stopack) THEN 
    810811            IF( nn_spp_avt > 0 ) CALL spp_gen(kt, avt(:,:,jk), nn_spp_avt, rn_avt_sd,jk) 
    811812            IF( nn_spp_avm > 0 ) CALL spp_gen(kt, avm(:,:,jk), nn_spp_avm, rn_avm_sd,jk) 
    812          ENDIF  
     813         ENDIF 
     814#else 
     815         IF ( ln_stopack ) & 
     816            & CALL ctl_stop( 'zdf_gls: parameter perturbation will only work with '// & 
     817                             'key_traldf_c2d or key_traldf_c3d') 
     818#endif 
    813819      END DO 
    814820      ! 
     
    851857      !!---------------------------------------------------------------------- 
    852858      !!                  ***  ROUTINE zdf_gls_init  *** 
    853       !!                      
    854       !! ** Purpose :   Initialization of the vertical eddy diffivity and  
     859      !! 
     860      !! ** Purpose :   Initialization of the vertical eddy diffivity and 
    855861      !!      viscosity when using a gls turbulent closure scheme 
    856862      !! 
     
    10711077         ! 
    10721078      END SELECT 
    1073      
     1079 
    10741080      !                                !* Set Schmidt number for psi diffusion in the wave breaking case 
    10751081      !                                     ! See Eq. (13) of Carniel et al, OM, 30, 225-239, 2009 
    10761082      !                                     !  or Eq. (17) of Burchard, JPO, 31, 3133-3145, 2001 
    10771083      IF( ln_sigpsi ) THEN 
    1078          ra_sf = -1.5 ! Set kinetic energy slope, then deduce rsc_psi and rl_sf  
     1084         ra_sf = -1.5 ! Set kinetic energy slope, then deduce rsc_psi and rl_sf 
    10791085         ! Verification: retrieve Burchard (2001) results by uncomenting the line below: 
    10801086         ! Note that the results depend on the value of rn_cm_sf which is constant (=rc0) in his work 
     
    10841090         rsc_psi0 = rsc_psi 
    10851091      ENDIF 
    1086   
     1092 
    10871093      !                                !* Shear free turbulence parameters 
    10881094      ! 
     
    11301136      rc04  = rc03 * rc0 
    11311137      rsbc_tke1 = -3._wp/2._wp*rn_crban*ra_sf*rl_sf                      ! Dirichlet + Wave breaking 
    1132       rsbc_tke2 = rdt * rn_crban / rl_sf                                 ! Neumann + Wave breaking  
     1138      rsbc_tke2 = rdt * rn_crban / rl_sf                                 ! Neumann + Wave breaking 
    11331139      zcr = MAX(rsmall, rsbc_tke1**(1./(-ra_sf*3._wp/2._wp))-1._wp ) 
    1134       rtrans = 0.2_wp / zcr                                              ! Ad. inverse transition length between log and wave layer  
     1140      rtrans = 0.2_wp / zcr                                              ! Ad. inverse transition length between log and wave layer 
    11351141      rsbc_zs1  = rn_charn/grav                                          ! Charnock formula for surface roughness 
    1136       rsbc_zs2  = rn_frac_hs / 0.85_wp / grav * 665._wp                  ! Rascle formula for surface roughness  
     1142      rsbc_zs2  = rn_frac_hs / 0.85_wp / grav * 665._wp                  ! Rascle formula for surface roughness 
    11371143      rsbc_psi1 = -0.5_wp * rdt * rc0**(rpp-2._wp*rmm) / rsc_psi 
    1138       rsbc_psi2 = -0.5_wp * rdt * rc0**rpp * rnn * vkarmn**rnn / rsc_psi ! Neumann + NO Wave breaking  
     1144      rsbc_psi2 = -0.5_wp * rdt * rc0**rpp * rnn * vkarmn**rnn / rsc_psi ! Neumann + NO Wave breaking 
    11391145 
    11401146      rfact_tke = -0.5_wp / rsc_tke * rdt                                ! Cst used for the Diffusion term of tke 
     
    11511157         avmv(:,:,jk) = avmb(jk) * vmask(:,:,jk) 
    11521158      END DO 
    1153       !                               
     1159      ! 
    11541160      CALL gls_rst( nit000, 'READ' )   !* read or initialize all required files 
    11551161      ! 
     
    11621168      !!--------------------------------------------------------------------- 
    11631169      !!                   ***  ROUTINE ts_rst  *** 
    1164       !!                      
     1170      !! 
    11651171      !! ** Purpose :   Read or write TKE file (en) in restart file 
    11661172      !! 
    11671173      !! ** Method  :   use of IOM library 
    1168       !!                if the restart does not contain TKE, en is either  
     1174      !!                if the restart does not contain TKE, en is either 
    11691175      !!                set to rn_emin or recomputed (nn_igls/=0) 
    11701176      !!---------------------------------------------------------------------- 
     
    11781184      !!---------------------------------------------------------------------- 
    11791185      ! 
    1180       IF( TRIM(cdrw) == 'READ' ) THEN        ! Read/initialise  
     1186      IF( TRIM(cdrw) == 'READ' ) THEN        ! Read/initialise 
    11811187         !                                   ! --------------- 
    11821188         IF( ln_rstart ) THEN                   !* Read the restart file 
     
    11971203               CALL iom_get( numror, jpdom_autoglo, 'mxln'  , mxln   ) 
    11981204               IF(nn_timing == 2)  CALL timing_stop('iom_rstget') 
    1199             ELSE                         
     1205            ELSE 
    12001206               IF(lwp) WRITE(numout,*) ' ===>>>> : previous run without gls scheme, en and mxln computed by iterative loop' 
    12011207               en  (:,:,:) = rn_emin 
    1202                mxln(:,:,:) = 0.05         
     1208               mxln(:,:,:) = 0.05 
    12031209               avt_k (:,:,:) = avt (:,:,:) 
    12041210               avm_k (:,:,:) = avm (:,:,:) 
     
    12101216            IF(lwp) WRITE(numout,*) ' ===>>>> : Initialisation of en and mxln by background values' 
    12111217            en  (:,:,:) = rn_emin 
    1212             mxln(:,:,:) = 0.05        
     1218            mxln(:,:,:) = 0.05 
    12131219         ENDIF 
    12141220         ! 
     
    12171223         IF(lwp) WRITE(numout,*) '---- gls-rst ----' 
    12181224         IF(nn_timing == 2)  CALL timing_start('iom_rstput') 
    1219          CALL iom_rstput( kt, nitrst, numrow, 'en'   , en     )  
     1225         CALL iom_rstput( kt, nitrst, numrow, 'en'   , en     ) 
    12201226         CALL iom_rstput( kt, nitrst, numrow, 'avt'  , avt_k  ) 
    12211227         CALL iom_rstput( kt, nitrst, numrow, 'avm'  , avm_k  ) 
    1222          CALL iom_rstput( kt, nitrst, numrow, 'avmu' , avmu_k )  
     1228         CALL iom_rstput( kt, nitrst, numrow, 'avmu' , avmu_k ) 
    12231229         CALL iom_rstput( kt, nitrst, numrow, 'avmv' , avmv_k ) 
    12241230         CALL iom_rstput( kt, nitrst, numrow, 'mxln' , mxln   ) 
     
    12391245      WRITE(*,*) 'zdf_gls_init: You should not have seen this print! error?' 
    12401246   END SUBROUTINE zdf_gls_init 
    1241     
     1247 
    12421248   SUBROUTINE zdf_gls( kt )          ! Empty routine 
    12431249   IMPLICIT NONE 
    1244       INTEGER, INTENT(in) ::   kt ! ocean time step    
     1250      INTEGER, INTENT(in) ::   kt ! ocean time step 
    12451251      WRITE(*,*) 'zdf_gls: You should not have seen this print! error?', kt 
    12461252   END SUBROUTINE zdf_gls 
    1247     
     1253 
    12481254   SUBROUTINE gls_rst( kt, cdrw )          ! Empty routine 
    12491255   IMPLICIT NONE 
     
    12561262   !!====================================================================== 
    12571263END MODULE zdfgls 
    1258  
Note: See TracChangeset for help on using the changeset viewer.