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/zdfiwm.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 moved

Legend:

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

    r7967 r7990  
    1 MODULE zdftmx 
     1MODULE zdfiwm 
    22   !!======================================================================== 
    3    !!                       ***  MODULE  zdftmx  *** 
     3   !!                       ***  MODULE  zdfiwm  *** 
    44   !! Ocean physics: Internal gravity wave-driven vertical mixing 
    55   !!======================================================================== 
     
    88   !!            3.3  !  2010-10  (C. Ethe, G. Madec)  reorganisation of initialisation phase 
    99   !!            3.6  !  2016-03  (C. de Lavergne)  New param: internal wave-driven mixing  
    10    !!            4.0  !  2017-04  (G. Madec)  Remove the old tidal mixing param. and key zdftmx(_new) 
     10   !!            4.0  !  2017-04  (G. Madec)  renamed module, remove the old param. and the CPP keys 
    1111   !!---------------------------------------------------------------------- 
    1212 
    1313   !!---------------------------------------------------------------------- 
    14    !!   zdf_tmx       : global     momentum & tracer Kz with wave induced Kz 
    15    !!   zdf_tmx_init  : global     momentum & tracer Kz with wave induced Kz 
     14   !!   zdf_iwm       : global     momentum & tracer Kz with wave induced Kz 
     15   !!   zdf_iwm_init  : global     momentum & tracer Kz with wave induced Kz 
    1616   !!---------------------------------------------------------------------- 
    1717   USE oce            ! ocean dynamics and tracers variables 
     
    3333   PRIVATE 
    3434 
    35    PUBLIC   zdf_tmx         ! called in step module  
    36    PUBLIC   zdf_tmx_init    ! called in nemogcm module  
    37    PUBLIC   zdf_tmx_alloc   ! called in nemogcm module 
    38  
    39    !                       !!* Namelist  namzdf_tmx : internal wave-driven mixing * 
     35   PUBLIC   zdf_iwm         ! called in step module  
     36   PUBLIC   zdf_iwm_init    ! called in nemogcm module  
     37   PUBLIC   zdf_iwm_alloc   ! called in nemogcm module 
     38 
     39   !                       !!* Namelist  namzdf_iwm : internal wave-driven mixing * 
    4040   INTEGER  ::  nn_zpyc     ! pycnocline-intensified mixing energy proportional to N (=1) or N^2 (=2) 
    4141   LOGICAL  ::  ln_mevar    ! variable (=T) or constant (=F) mixing efficiency 
     
    4444   REAL(wp) ::  r1_6 = 1._wp / 6._wp 
    4545 
    46    REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   ebot_tmx     ! power available from high-mode wave breaking (W/m2) 
    47    REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   epyc_tmx     ! power available from low-mode, pycnocline-intensified wave breaking (W/m2) 
    48    REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   ecri_tmx     ! power available from low-mode, critical slope wave breaking (W/m2) 
    49    REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   hbot_tmx     ! WKB decay scale for high-mode energy dissipation (m) 
    50    REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   hcri_tmx     ! decay scale for low-mode critical slope dissipation (m) 
    51    REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   emix_tmx     ! local energy density available for mixing (W/kg) 
    52    REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   bflx_tmx     ! buoyancy flux Kz * N^2 (W/kg) 
    53    REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   pcmap_tmx    ! vertically integrated buoyancy flux (W/m2) 
     46   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   ebot_iwm     ! power available from high-mode wave breaking (W/m2) 
     47   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   epyc_iwm     ! power available from low-mode, pycnocline-intensified wave breaking (W/m2) 
     48   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   ecri_iwm     ! power available from low-mode, critical slope wave breaking (W/m2) 
     49   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   hbot_iwm     ! WKB decay scale for high-mode energy dissipation (m) 
     50   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   hcri_iwm     ! decay scale for low-mode critical slope dissipation (m) 
     51   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   emix_iwm     ! local energy density available for mixing (W/kg) 
     52   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   bflx_iwm     ! buoyancy flux Kz * N^2 (W/kg) 
     53   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   pcmap_iwm    ! vertically integrated buoyancy flux (W/m2) 
    5454   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   zav_ratio    ! S/T diffusivity ratio (only for ln_tsdiff=T) 
    5555   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   zav_wave     ! Internal wave-induced diffusivity 
     
    6464CONTAINS 
    6565 
    66    INTEGER FUNCTION zdf_tmx_alloc() 
    67       !!---------------------------------------------------------------------- 
    68       !!                ***  FUNCTION zdf_tmx_alloc  *** 
    69       !!---------------------------------------------------------------------- 
    70       ALLOCATE(     ebot_tmx(jpi,jpj),  epyc_tmx(jpi,jpj),  ecri_tmx(jpi,jpj)    ,   & 
    71       &             hbot_tmx(jpi,jpj),  hcri_tmx(jpi,jpj),  emix_tmx(jpi,jpj,jpk),   & 
    72       &         bflx_tmx(jpi,jpj,jpk), pcmap_tmx(jpi,jpj), zav_ratio(jpi,jpj,jpk),   &  
    73       &         zav_wave(jpi,jpj,jpk), STAT=zdf_tmx_alloc     ) 
    74       ! 
    75       IF( lk_mpp             )   CALL mpp_sum ( zdf_tmx_alloc ) 
    76       IF( zdf_tmx_alloc /= 0 )   CALL ctl_warn('zdf_tmx_alloc: failed to allocate arrays') 
    77    END FUNCTION zdf_tmx_alloc 
    78  
    79  
    80    SUBROUTINE zdf_tmx( kt ) 
    81       !!---------------------------------------------------------------------- 
    82       !!                  ***  ROUTINE zdf_tmx  *** 
     66   INTEGER FUNCTION zdf_iwm_alloc() 
     67      !!---------------------------------------------------------------------- 
     68      !!                ***  FUNCTION zdf_iwm_alloc  *** 
     69      !!---------------------------------------------------------------------- 
     70      ALLOCATE(     ebot_iwm(jpi,jpj),  epyc_iwm(jpi,jpj),  ecri_iwm(jpi,jpj)    ,   & 
     71      &             hbot_iwm(jpi,jpj),  hcri_iwm(jpi,jpj),  emix_iwm(jpi,jpj,jpk),   & 
     72      &         bflx_iwm(jpi,jpj,jpk), pcmap_iwm(jpi,jpj), zav_ratio(jpi,jpj,jpk),   &  
     73      &         zav_wave(jpi,jpj,jpk), STAT=zdf_iwm_alloc     ) 
     74      ! 
     75      IF( lk_mpp             )   CALL mpp_sum ( zdf_iwm_alloc ) 
     76      IF( zdf_iwm_alloc /= 0 )   CALL ctl_warn('zdf_iwm_alloc: failed to allocate arrays') 
     77   END FUNCTION zdf_iwm_alloc 
     78 
     79 
     80   SUBROUTINE zdf_iwm( kt ) 
     81      !!---------------------------------------------------------------------- 
     82      !!                  ***  ROUTINE zdf_iwm  *** 
    8383      !!                    
    8484      !! ** Purpose :   add to the vertical mixing coefficients the effect of 
     
    8686      !! 
    8787      !! ** Method  : - internal wave-driven vertical mixing is given by: 
    88       !!                  Kz_wave = min(  100 cm2/s, f(  Reb = emix_tmx /( Nu * N^2 )  ) 
    89       !!              where emix_tmx is the 3D space distribution of the wave-breaking  
     88      !!                  Kz_wave = min(  100 cm2/s, f(  Reb = emix_iwm /( Nu * N^2 )  ) 
     89      !!              where emix_iwm is the 3D space distribution of the wave-breaking  
    9090      !!              energy and Nu the molecular kinematic viscosity. 
    9191      !!              The function f(Reb) is linear (constant mixing efficiency) 
    9292      !!              if the namelist parameter ln_mevar = F and nonlinear if ln_mevar = T. 
    9393      !! 
    94       !!              - Compute emix_tmx, the 3D power density that allows to compute 
     94      !!              - Compute emix_iwm, the 3D power density that allows to compute 
    9595      !!              Reb and therefrom the wave-induced vertical diffusivity. 
    9696      !!              This is divided into three components: 
    9797      !!                 1. Bottom-intensified low-mode dissipation at critical slopes 
    98       !!                     emix_tmx(z) = ( ecri_tmx / rau0 ) * EXP( -(H-z)/hcri_tmx ) 
    99       !!                                   / ( 1. - EXP( - H/hcri_tmx ) ) * hcri_tmx 
    100       !!              where hcri_tmx is the characteristic length scale of the bottom  
    101       !!              intensification, ecri_tmx a map of available power, and H the ocean depth. 
     98      !!                     emix_iwm(z) = ( ecri_iwm / rau0 ) * EXP( -(H-z)/hcri_iwm ) 
     99      !!                                   / ( 1. - EXP( - H/hcri_iwm ) ) * hcri_iwm 
     100      !!              where hcri_iwm is the characteristic length scale of the bottom  
     101      !!              intensification, ecri_iwm a map of available power, and H the ocean depth. 
    102102      !!                 2. Pycnocline-intensified low-mode dissipation 
    103       !!                     emix_tmx(z) = ( epyc_tmx / rau0 ) * ( sqrt(rn2(z))^nn_zpyc ) 
     103      !!                     emix_iwm(z) = ( epyc_iwm / rau0 ) * ( sqrt(rn2(z))^nn_zpyc ) 
    104104      !!                                   / SUM( sqrt(rn2(z))^nn_zpyc * e3w(z) ) 
    105       !!              where epyc_tmx is a map of available power, and nn_zpyc 
     105      !!              where epyc_iwm is a map of available power, and nn_zpyc 
    106106      !!              is the chosen stratification-dependence of the internal wave 
    107107      !!              energy dissipation. 
    108108      !!                 3. WKB-height dependent high mode dissipation 
    109       !!                     emix_tmx(z) = ( ebot_tmx / rau0 ) * rn2(z) * EXP(-z_wkb(z)/hbot_tmx) 
    110       !!                                   / SUM( rn2(z) * EXP(-z_wkb(z)/hbot_tmx) * e3w(z) ) 
    111       !!              where hbot_tmx is the characteristic length scale of the WKB bottom  
    112       !!              intensification, ebot_tmx is a map of available power, and z_wkb is the 
     109      !!                     emix_iwm(z) = ( ebot_iwm / rau0 ) * rn2(z) * EXP(-z_wkb(z)/hbot_iwm) 
     110      !!                                   / SUM( rn2(z) * EXP(-z_wkb(z)/hbot_iwm) * e3w(z) ) 
     111      !!              where hbot_iwm is the characteristic length scale of the WKB bottom  
     112      !!              intensification, ebot_iwm is a map of available power, and z_wkb is the 
    113113      !!              WKB-stretched height above bottom defined as 
    114114      !!                    z_wkb(z) = H * SUM( sqrt(rn2(z'>=z)) * e3w(z'>=z) ) 
     
    118118      !!                     avt  = avt  +    av_wave 
    119119      !!                     avm  = avm  +    av_wave 
    120       !!                     avmu = avmu + mi(av_wave) 
    121       !!                     avmv = avmv + mj(av_wave) 
    122120      !! 
    123121      !!              - if namelist parameter ln_tsdiff = T, account for differential mixing: 
    124122      !!                     avs  = avt  +    av_wave * diffusivity_ratio(Reb) 
    125123      !! 
    126       !! ** Action  : - Define emix_tmx used to compute internal wave-induced mixing 
    127       !!              - avt, avs, avm, avmu, avmv increased by internal wave-driven mixing     
     124      !! ** Action  : - Define emix_iwm used to compute internal wave-induced mixing 
     125      !!              - avt, avs, avm, increased by internal wave-driven mixing     
    128126      !! 
    129127      !! References :  de Lavergne et al. 2015, JPO; 2016, in prep. 
     
    142140      !!---------------------------------------------------------------------- 
    143141      ! 
    144       IF( nn_timing == 1 )   CALL timing_start('zdf_tmx') 
     142      IF( nn_timing == 1 )   CALL timing_start('zdf_iwm') 
    145143      ! 
    146144      CALL wrk_alloc( jpi,jpj,       zfact, zhdep ) 
     
    156154         DO ji = 1, jpi 
    157155            zhdep(ji,jj) = gdepw_0(ji,jj,mbkt(ji,jj)+1)       ! depth of the ocean 
    158             zfact(ji,jj) = rau0 * (  1._wp - EXP( -zhdep(ji,jj) / hcri_tmx(ji,jj) )  ) 
    159             IF( zfact(ji,jj) /= 0 )   zfact(ji,jj) = ecri_tmx(ji,jj) / zfact(ji,jj) 
     156            zfact(ji,jj) = rau0 * (  1._wp - EXP( -zhdep(ji,jj) / hcri_iwm(ji,jj) )  ) 
     157            IF( zfact(ji,jj) /= 0._wp )   zfact(ji,jj) = ecri_iwm(ji,jj) / zfact(ji,jj) 
    160158         END DO 
    161159      END DO 
    162160 
    163161      DO jk = 2, jpkm1              ! complete with the level-dependent part 
    164          emix_tmx(:,:,jk) = zfact(:,:) * (  EXP( ( gde3w_n(:,:,jk  ) - zhdep(:,:) ) / hcri_tmx(:,:) )                      & 
    165             &                             - EXP( ( gde3w_n(:,:,jk-1) - zhdep(:,:) ) / hcri_tmx(:,:) )  ) * wmask(:,:,jk)   & 
     162         emix_iwm(:,:,jk) = zfact(:,:) * (  EXP( ( gde3w_n(:,:,jk  ) - zhdep(:,:) ) / hcri_iwm(:,:) )                      & 
     163            &                             - EXP( ( gde3w_n(:,:,jk-1) - zhdep(:,:) ) / hcri_iwm(:,:) )  ) * wmask(:,:,jk)   & 
    166164!!gm delta(gde3w_n) = e3t_n  !!  Please verify the grid-point position w versus t-point 
    167165            &                          / ( gde3w_n(:,:,jk) - gde3w_n(:,:,jk-1) ) 
     
    170168      !                        !* Pycnocline-intensified mixing: distribute energy over the time-varying  
    171169      !                        !* ocean depth as proportional to sqrt(rn2)^nn_zpyc 
    172  
     170      ! 
    173171      SELECT CASE ( nn_zpyc ) 
    174  
     172      ! 
    175173      CASE ( 1 )               ! Dissipation scales as N (recommended) 
    176  
     174         ! 
    177175         zfact(:,:) = 0._wp 
    178176         DO jk = 2, jpkm1              ! part independent of the level 
    179177            zfact(:,:) = zfact(:,:) + e3w_n(:,:,jk) * SQRT(  MAX( 0._wp, rn2(:,:,jk) )  ) * wmask(:,:,jk) 
    180178         END DO 
    181  
     179         ! 
    182180         DO jj = 1, jpj 
    183181            DO ji = 1, jpi 
    184                IF( zfact(ji,jj) /= 0 )   zfact(ji,jj) = epyc_tmx(ji,jj) / ( rau0 * zfact(ji,jj) ) 
    185             END DO 
    186          END DO 
    187  
     182               IF( zfact(ji,jj) /= 0 )   zfact(ji,jj) = epyc_iwm(ji,jj) / ( rau0 * zfact(ji,jj) ) 
     183            END DO 
     184         END DO 
     185         ! 
    188186         DO jk = 2, jpkm1              ! complete with the level-dependent part 
    189             emix_tmx(:,:,jk) = emix_tmx(:,:,jk) + zfact(:,:) * SQRT(  MAX( 0._wp, rn2(:,:,jk) )  ) * wmask(:,:,jk) 
    190          END DO 
    191  
     187            emix_iwm(:,:,jk) = emix_iwm(:,:,jk) + zfact(:,:) * SQRT(  MAX( 0._wp, rn2(:,:,jk) )  ) * wmask(:,:,jk) 
     188         END DO 
     189         ! 
    192190      CASE ( 2 )               ! Dissipation scales as N^2 
    193  
     191         ! 
    194192         zfact(:,:) = 0._wp 
    195193         DO jk = 2, jpkm1              ! part independent of the level 
    196194            zfact(:,:) = zfact(:,:) + e3w_n(:,:,jk) * MAX( 0._wp, rn2(:,:,jk) ) * wmask(:,:,jk) 
    197195         END DO 
    198  
     196         ! 
    199197         DO jj= 1, jpj 
    200198            DO ji = 1, jpi 
    201                IF( zfact(ji,jj) /= 0 )   zfact(ji,jj) = epyc_tmx(ji,jj) / ( rau0 * zfact(ji,jj) ) 
    202             END DO 
    203          END DO 
    204  
     199               IF( zfact(ji,jj) /= 0 )   zfact(ji,jj) = epyc_iwm(ji,jj) / ( rau0 * zfact(ji,jj) ) 
     200            END DO 
     201         END DO 
     202         ! 
    205203         DO jk = 2, jpkm1              ! complete with the level-dependent part 
    206             emix_tmx(:,:,jk) = emix_tmx(:,:,jk) + zfact(:,:) * MAX( 0._wp, rn2(:,:,jk) ) * wmask(:,:,jk) 
    207          END DO 
    208  
     204            emix_iwm(:,:,jk) = emix_iwm(:,:,jk) + zfact(:,:) * MAX( 0._wp, rn2(:,:,jk) ) * wmask(:,:,jk) 
     205         END DO 
     206         ! 
    209207      END SELECT 
    210208 
    211209      !                        !* WKB-height dependent mixing: distribute energy over the time-varying  
    212210      !                        !* ocean depth as proportional to rn2 * exp(-z_wkb/rn_hbot) 
    213        
     211      ! 
    214212      zwkb(:,:,:) = 0._wp 
    215213      zfact(:,:) = 0._wp 
     
    218216         zwkb(:,:,jk) = zfact(:,:) 
    219217      END DO 
    220  
     218      ! 
    221219      DO jk = 2, jpkm1 
    222220         DO jj = 1, jpj 
    223221            DO ji = 1, jpi 
    224222               IF( zfact(ji,jj) /= 0 )   zwkb(ji,jj,jk) = zhdep(ji,jj) * ( zfact(ji,jj) - zwkb(ji,jj,jk) )   & 
    225                                             &           * tmask(ji,jj,jk) / zfact(ji,jj) 
     223                  &                                     * tmask(ji,jj,jk) / zfact(ji,jj) 
    226224            END DO 
    227225         END DO 
    228226      END DO 
    229227      zwkb(:,:,1) = zhdep(:,:) * tmask(:,:,1) 
    230  
     228      ! 
    231229      zweight(:,:,:) = 0._wp 
    232230      DO jk = 2, jpkm1 
    233          zweight(:,:,jk) = MAX( 0._wp, rn2(:,:,jk) ) * hbot_tmx(:,:) * wmask(:,:,jk)                    & 
    234             &   * (  EXP( -zwkb(:,:,jk) / hbot_tmx(:,:) ) - EXP( -zwkb(:,:,jk-1) / hbot_tmx(:,:) )  ) 
    235       END DO 
    236  
     231         zweight(:,:,jk) = MAX( 0._wp, rn2(:,:,jk) ) * hbot_iwm(:,:) * wmask(:,:,jk)                    & 
     232            &   * (  EXP( -zwkb(:,:,jk) / hbot_iwm(:,:) ) - EXP( -zwkb(:,:,jk-1) / hbot_iwm(:,:) )  ) 
     233      END DO 
     234      ! 
    237235      zfact(:,:) = 0._wp 
    238236      DO jk = 2, jpkm1              ! part independent of the level 
    239237         zfact(:,:) = zfact(:,:) + zweight(:,:,jk) 
    240238      END DO 
    241  
     239      ! 
    242240      DO jj = 1, jpj 
    243241         DO ji = 1, jpi 
    244             IF( zfact(ji,jj) /= 0 )   zfact(ji,jj) = ebot_tmx(ji,jj) / ( rau0 * zfact(ji,jj) ) 
    245          END DO 
    246       END DO 
    247  
     242            IF( zfact(ji,jj) /= 0 )   zfact(ji,jj) = ebot_iwm(ji,jj) / ( rau0 * zfact(ji,jj) ) 
     243         END DO 
     244      END DO 
     245      ! 
    248246      DO jk = 2, jpkm1              ! complete with the level-dependent part 
    249          emix_tmx(:,:,jk) = emix_tmx(:,:,jk) + zweight(:,:,jk) * zfact(:,:) * wmask(:,:,jk)   & 
     247         emix_iwm(:,:,jk) = emix_iwm(:,:,jk) + zweight(:,:,jk) * zfact(:,:) * wmask(:,:,jk)   & 
    250248            &                                / ( gde3w_n(:,:,jk) - gde3w_n(:,:,jk-1) ) 
    251249      END DO 
    252  
    253  
     250      ! 
    254251      ! Calculate molecular kinematic viscosity 
    255252      znu_t(:,:,:) = 1.e-4_wp * (  17.91_wp - 0.53810_wp * tsn(:,:,:,jp_tem) + 0.00694_wp * tsn(:,:,:,jp_tem) * tsn(:,:,:,jp_tem)  & 
     
    258255         znu_w(:,:,jk) = 0.5_wp * ( znu_t(:,:,jk-1) + znu_t(:,:,jk) ) * wmask(:,:,jk) 
    259256      END DO 
    260  
     257      ! 
    261258      ! Calculate turbulence intensity parameter Reb 
    262259      DO jk = 2, jpkm1 
    263          zReb(:,:,jk) = emix_tmx(:,:,jk) / MAX( 1.e-20_wp, znu_w(:,:,jk) * rn2(:,:,jk) ) 
    264       END DO 
    265  
     260         zReb(:,:,jk) = emix_iwm(:,:,jk) / MAX( 1.e-20_wp, znu_w(:,:,jk) * rn2(:,:,jk) ) 
     261      END DO 
     262      ! 
    266263      ! Define internal wave-induced diffusivity 
    267264      DO jk = 2, jpkm1 
    268265         zav_wave(:,:,jk) = znu_w(:,:,jk) * zReb(:,:,jk) * r1_6   ! This corresponds to a constant mixing efficiency of 1/6 
    269266      END DO 
    270  
     267      ! 
    271268      IF( ln_mevar ) THEN              ! Variable mixing efficiency case : modify zav_wave in the 
    272269         DO jk = 2, jpkm1              ! energetic (Reb > 480) and buoyancy-controlled (Reb <10.224 ) regimes 
     
    282279         END DO 
    283280      ENDIF 
    284  
     281      ! 
    285282      DO jk = 2, jpkm1                 ! Bound diffusivity by molecular value and 100 cm2/s 
    286283         zav_wave(:,:,jk) = MIN(  MAX( 1.4e-7_wp, zav_wave(:,:,jk) ), 1.e-2_wp  ) * wmask(:,:,jk) 
    287284      END DO 
    288  
     285      ! 
    289286      IF( kt == nit000 ) THEN        !* Control print at first time-step: diagnose the energy consumed by zav_wave 
    290287         ztpc = 0._wp 
     
    300297         IF( lk_mpp )   CALL mpp_sum( ztpc ) 
    301298         ztpc = rau0 * ztpc ! Global integral of rauo * Kz * N^2 = power contributing to mixing  
    302   
     299         ! 
    303300         IF(lwp) THEN 
    304301            WRITE(numout,*) 
    305             WRITE(numout,*) 'zdf_tmx : Internal wave-driven mixing (tmx)' 
     302            WRITE(numout,*) 'zdf_iwm : Internal wave-driven mixing (iwm)' 
    306303            WRITE(numout,*) '~~~~~~~ ' 
    307304            WRITE(numout,*) 
     
    339336      ENDIF 
    340337 
    341       DO jk = 2, jpkm1              !* update momentum diffusivity at wu and wv points 
    342          DO jj = 2, jpjm1 
    343             DO ji = fs_2, fs_jpim1  ! vector opt. 
    344                avmu(ji,jj,jk) = avmu(ji,jj,jk) + 0.5_wp * ( zav_wave(ji,jj,jk) + zav_wave(ji+1,jj  ,jk) ) * wumask(ji,jj,jk) 
    345                avmv(ji,jj,jk) = avmv(ji,jj,jk) + 0.5_wp * ( zav_wave(ji,jj,jk) + zav_wave(ji  ,jj+1,jk) ) * wvmask(ji,jj,jk) 
    346             END DO 
    347          END DO 
    348       END DO 
    349       CALL lbc_lnk( avmu, 'U', 1. )   ;   CALL lbc_lnk( avmv, 'V', 1. )      ! lateral boundary condition 
    350  
    351338      !                             !* output internal wave-driven mixing coefficient 
    352339      CALL iom_put( "av_wave", zav_wave ) 
    353                                     !* output useful diagnostics: N^2, Kz * N^2 (bflx_tmx),  
    354                                     !  vertical integral of rau0 * Kz * N^2 (pcmap_tmx), energy density (emix_tmx) 
    355       IF( iom_use("bflx_tmx") .OR. iom_use("pcmap_tmx") ) THEN 
    356          bflx_tmx(:,:,:) = MAX( 0._wp, rn2(:,:,:) ) * zav_wave(:,:,:) 
    357          pcmap_tmx(:,:) = 0._wp 
     340                                    !* output useful diagnostics: N^2, Kz * N^2 (bflx_iwm),  
     341                                    !  vertical integral of rau0 * Kz * N^2 (pcmap_iwm), energy density (emix_iwm) 
     342      IF( iom_use("bflx_iwm") .OR. iom_use("pcmap_iwm") ) THEN 
     343         bflx_iwm(:,:,:) = MAX( 0._wp, rn2(:,:,:) ) * zav_wave(:,:,:) 
     344         pcmap_iwm(:,:) = 0._wp 
    358345         DO jk = 2, jpkm1 
    359             pcmap_tmx(:,:) = pcmap_tmx(:,:) + e3w_n(:,:,jk) * bflx_tmx(:,:,jk) * wmask(:,:,jk) 
    360          END DO 
    361          pcmap_tmx(:,:) = rau0 * pcmap_tmx(:,:) 
    362          CALL iom_put( "bflx_tmx", bflx_tmx ) 
    363          CALL iom_put( "pcmap_tmx", pcmap_tmx ) 
     346            pcmap_iwm(:,:) = pcmap_iwm(:,:) + e3w_n(:,:,jk) * bflx_iwm(:,:,jk) * wmask(:,:,jk) 
     347         END DO 
     348         pcmap_iwm(:,:) = rau0 * pcmap_iwm(:,:) 
     349         CALL iom_put( "bflx_iwm", bflx_iwm ) 
     350         CALL iom_put( "pcmap_iwm", pcmap_iwm ) 
    364351      ENDIF 
    365352      CALL iom_put( "bn2", rn2 ) 
    366       CALL iom_put( "emix_tmx", emix_tmx ) 
     353      CALL iom_put( "emix_iwm", emix_iwm ) 
    367354       
    368355      CALL wrk_dealloc( jpi,jpj,       zfact, zhdep ) 
    369356      CALL wrk_dealloc( jpi,jpj,jpk,   zwkb, zweight, znu_t, znu_w, zReb ) 
    370357 
    371       IF(ln_ctl)   CALL prt_ctl(tab3d_1=zav_wave , clinfo1=' tmx - av_wave: ', tab3d_2=avt, clinfo2=' avt: ', ovlap=1, kdim=jpk) 
    372       ! 
    373       IF( nn_timing == 1 )   CALL timing_stop('zdf_tmx') 
    374       ! 
    375    END SUBROUTINE zdf_tmx 
    376  
    377  
    378    SUBROUTINE zdf_tmx_init 
    379       !!---------------------------------------------------------------------- 
    380       !!                  ***  ROUTINE zdf_tmx_init  *** 
     358      IF(ln_ctl)   CALL prt_ctl(tab3d_1=zav_wave , clinfo1=' iwm - av_wave: ', tab3d_2=avt, clinfo2=' avt: ', ovlap=1, kdim=jpk) 
     359      ! 
     360      IF( nn_timing == 1 )   CALL timing_stop('zdf_iwm') 
     361      ! 
     362   END SUBROUTINE zdf_iwm 
     363 
     364 
     365   SUBROUTINE zdf_iwm_init 
     366      !!---------------------------------------------------------------------- 
     367      !!                  ***  ROUTINE zdf_iwm_init  *** 
    381368      !!                      
    382369      !! ** Purpose :   Initialization of the wave-driven vertical mixing, reading 
    383370      !!              of input power maps and decay length scales in netcdf files. 
    384371      !! 
    385       !! ** Method  : - Read the namzdf_tmx namelist and check the parameters 
     372      !! ** Method  : - Read the namzdf_iwm namelist and check the parameters 
    386373      !! 
    387374      !!              - Read the input data in NetCDF files : 
     
    392379      !!              decay scale for critical slope wave-breaking (decay_scale_cri.nc) 
    393380      !! 
    394       !! ** input   : - Namlist namzdf_tmx 
     381      !! ** input   : - Namlist namzdf_iwm 
    395382      !!              - NetCDF files : mixing_power_bot.nc, mixing_power_pyc.nc, mixing_power_cri.nc, 
    396383      !!              decay_scale_bot.nc decay_scale_cri.nc 
    397384      !! 
    398385      !! ** Action  : - Increase by 1 the nstop flag is setting problem encounter 
    399       !!              - Define ebot_tmx, epyc_tmx, ecri_tmx, hbot_tmx, hcri_tmx 
    400       !! 
    401       !! References : de Lavergne et al. 2015, JPO; 2016, in prep. 
    402       !!          
     386      !!              - Define ebot_iwm, epyc_iwm, ecri_iwm, hbot_iwm, hcri_iwm 
     387      !! 
     388      !! References : de Lavergne et al. JPO, 2015 ; de Lavergne PhD 2016 
     389      !!              de Lavergne et al. in prep., 2017 
    403390      !!---------------------------------------------------------------------- 
    404391      INTEGER  ::   ji, jj, jk   ! dummy loop indices 
     
    407394      REAL(wp) ::   zbot, zpyc, zcri   ! local scalars 
    408395      !! 
    409       NAMELIST/namzdf_tmx_new/ nn_zpyc, ln_mevar, ln_tsdiff 
    410       !!---------------------------------------------------------------------- 
    411       ! 
    412       IF( nn_timing == 1 )  CALL timing_start('zdf_tmx_init') 
    413       ! 
    414       REWIND( numnam_ref )              ! Namelist namzdf_tmx in reference namelist : Wave-driven mixing 
    415       READ  ( numnam_ref, namzdf_tmx_new, IOSTAT = ios, ERR = 901) 
    416 901   IF( ios /= 0 ) CALL ctl_nam ( ios , 'namzdf_tmx in reference namelist', lwp ) 
    417       ! 
    418       REWIND( numnam_cfg )              ! Namelist namzdf_tmx in configuration namelist : Wave-driven mixing 
    419       READ  ( numnam_cfg, namzdf_tmx_new, IOSTAT = ios, ERR = 902 ) 
    420 902   IF( ios /= 0 ) CALL ctl_nam ( ios , 'namzdf_tmx in configuration namelist', lwp ) 
    421       IF(lwm) WRITE ( numond, namzdf_tmx_new ) 
     396      NAMELIST/namzdf_iwm_new/ nn_zpyc, ln_mevar, ln_tsdiff 
     397      !!---------------------------------------------------------------------- 
     398      ! 
     399      IF( nn_timing == 1 )  CALL timing_start('zdf_iwm_init') 
     400      ! 
     401      REWIND( numnam_ref )              ! Namelist namzdf_iwm in reference namelist : Wave-driven mixing 
     402      READ  ( numnam_ref, namzdf_iwm_new, IOSTAT = ios, ERR = 901) 
     403901   IF( ios /= 0 ) CALL ctl_nam ( ios , 'namzdf_iwm in reference namelist', lwp ) 
     404      ! 
     405      REWIND( numnam_cfg )              ! Namelist namzdf_iwm in configuration namelist : Wave-driven mixing 
     406      READ  ( numnam_cfg, namzdf_iwm_new, IOSTAT = ios, ERR = 902 ) 
     407902   IF( ios /= 0 ) CALL ctl_nam ( ios , 'namzdf_iwm in configuration namelist', lwp ) 
     408      IF(lwm) WRITE ( numond, namzdf_iwm_new ) 
    422409      ! 
    423410      IF(lwp) THEN                  ! Control print 
    424411         WRITE(numout,*) 
    425          WRITE(numout,*) 'zdf_tmx_init : internal wave-driven mixing' 
     412         WRITE(numout,*) 'zdf_iwm_init : internal wave-driven mixing' 
    426413         WRITE(numout,*) '~~~~~~~~~~~~' 
    427          WRITE(numout,*) '   Namelist namzdf_tmx_new : set wave-driven mixing parameters' 
     414         WRITE(numout,*) '   Namelist namzdf_iwm_new : set wave-driven mixing parameters' 
    428415         WRITE(numout,*) '      Pycnocline-intensified diss. scales as N (=1) or N^2 (=2) = ', nn_zpyc 
    429416         WRITE(numout,*) '      Variable (T) or constant (F) mixing efficiency            = ', ln_mevar 
     
    435422      ! be set here to a very small value, and avmb to its (uniform) molecular value (=1.4e-6). 
    436423      avmb(:) = 1.4e-6_wp        ! viscous molecular value 
    437       avtb(:) = 1.e-10_wp        ! very small diffusive minimum (background avt is specified in zdf_tmx)     
     424      avtb(:) = 1.e-10_wp        ! very small diffusive minimum (background avt is specified in zdf_iwm)     
    438425      avtb_2d(:,:) = 1.e0_wp     ! uniform  
    439426      IF(lwp) THEN                  ! Control print 
     
    443430      ENDIF 
    444431             
    445       !                             ! allocate tmx arrays 
    446       IF( zdf_tmx_alloc() /= 0 )   CALL ctl_stop( 'STOP', 'zdf_tmx_init : unable to allocate tmx arrays' ) 
     432      !                             ! allocate iwm arrays 
     433      IF( zdf_iwm_alloc() /= 0 )   CALL ctl_stop( 'STOP', 'zdf_iwm_init : unable to allocate iwm arrays' ) 
    447434      ! 
    448435      !                             ! read necessary fields 
    449436      CALL iom_open('mixing_power_bot',inum)       ! energy flux for high-mode wave breaking [W/m2] 
    450       CALL iom_get  (inum, jpdom_data, 'field', ebot_tmx, 1 )  
     437      CALL iom_get  (inum, jpdom_data, 'field', ebot_iwm, 1 )  
    451438      CALL iom_close(inum) 
    452439      ! 
    453440      CALL iom_open('mixing_power_pyc',inum)       ! energy flux for pynocline-intensified wave breaking [W/m2] 
    454       CALL iom_get  (inum, jpdom_data, 'field', epyc_tmx, 1 ) 
     441      CALL iom_get  (inum, jpdom_data, 'field', epyc_iwm, 1 ) 
    455442      CALL iom_close(inum) 
    456443      ! 
    457444      CALL iom_open('mixing_power_cri',inum)       ! energy flux for critical slope wave breaking [W/m2] 
    458       CALL iom_get  (inum, jpdom_data, 'field', ecri_tmx, 1 ) 
     445      CALL iom_get  (inum, jpdom_data, 'field', ecri_iwm, 1 ) 
    459446      CALL iom_close(inum) 
    460447      ! 
    461448      CALL iom_open('decay_scale_bot',inum)        ! spatially variable decay scale for high-mode wave breaking [m] 
    462       CALL iom_get  (inum, jpdom_data, 'field', hbot_tmx, 1 ) 
     449      CALL iom_get  (inum, jpdom_data, 'field', hbot_iwm, 1 ) 
    463450      CALL iom_close(inum) 
    464451      ! 
    465452      CALL iom_open('decay_scale_cri',inum)        ! spatially variable decay scale for critical slope wave breaking [m] 
    466       CALL iom_get  (inum, jpdom_data, 'field', hcri_tmx, 1 ) 
     453      CALL iom_get  (inum, jpdom_data, 'field', hcri_iwm, 1 ) 
    467454      CALL iom_close(inum) 
    468455 
    469       ebot_tmx(:,:) = ebot_tmx(:,:) * ssmask(:,:) 
    470       epyc_tmx(:,:) = epyc_tmx(:,:) * ssmask(:,:) 
    471       ecri_tmx(:,:) = ecri_tmx(:,:) * ssmask(:,:) 
     456      ebot_iwm(:,:) = ebot_iwm(:,:) * ssmask(:,:) 
     457      epyc_iwm(:,:) = epyc_iwm(:,:) * ssmask(:,:) 
     458      ecri_iwm(:,:) = ecri_iwm(:,:) * ssmask(:,:) 
    472459 
    473460      ! Set once for all to zero the first and last vertical levels of appropriate variables 
    474       emix_tmx (:,:, 1 ) = 0._wp 
    475       emix_tmx (:,:,jpk) = 0._wp 
     461      emix_iwm (:,:, 1 ) = 0._wp 
     462      emix_iwm (:,:,jpk) = 0._wp 
    476463      zav_ratio(:,:, 1 ) = 0._wp 
    477464      zav_ratio(:,:,jpk) = 0._wp 
     
    479466      zav_wave (:,:,jpk) = 0._wp 
    480467 
    481       zbot = glob_sum( e1e2t(:,:) * ebot_tmx(:,:) ) 
    482       zpyc = glob_sum( e1e2t(:,:) * epyc_tmx(:,:) ) 
    483       zcri = glob_sum( e1e2t(:,:) * ecri_tmx(:,:) ) 
     468      zbot = glob_sum( e1e2t(:,:) * ebot_iwm(:,:) ) 
     469      zpyc = glob_sum( e1e2t(:,:) * epyc_iwm(:,:) ) 
     470      zcri = glob_sum( e1e2t(:,:) * ecri_iwm(:,:) ) 
    484471      IF(lwp) THEN 
    485472         WRITE(numout,*) '      High-mode wave-breaking energy:             ', zbot * 1.e-12_wp, 'TW' 
     
    488475      ENDIF 
    489476      ! 
    490       IF( nn_timing == 1 )  CALL timing_stop('zdf_tmx_init') 
    491       ! 
    492    END SUBROUTINE zdf_tmx_init 
     477      IF( nn_timing == 1 )  CALL timing_stop('zdf_iwm_init') 
     478      ! 
     479   END SUBROUTINE zdf_iwm_init 
    493480 
    494481   !!====================================================================== 
    495 END MODULE zdftmx 
     482END MODULE zdfiwm 
Note: See TracChangeset for help on using the changeset viewer.