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/zdfswm.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/zdfswm.F90

    r7967 r7990  
    1 MODULE zdfqiao 
     1MODULE zdfswm 
    22   !!====================================================================== 
    3    !!                       ***  MODULE  zdfqiao  *** 
    4    !! Qiao module      : vertical mixing enhancement due to surface waves  
     3   !!                       ***  MODULE  zdfswm  *** 
     4   !! vertical physics :   surface wave-induced mixing  
    55   !!====================================================================== 
    66   !! History :  3.6  !  2014-10  (E. Clementi)  Original code 
    7    !!---------------------------------------------------------------------- 
    8    !!   zdf_qiao        : compute Qiao parameters 
     7   !!            4.0  !  2017-04  (G. Madec)  debug + simplifications 
    98   !!---------------------------------------------------------------------- 
    109 
    11    USE in_out_manager  ! I/O manager 
    12    USE lib_mpp         ! distribued memory computing library 
    13    USE sbc_oce         ! Surface boundary condition: ocean fields 
    14    USE zdf_oce 
    15    USE sbcwave         ! wave module 
    16    USE dom_oce 
    17    USE lbclnk          ! ocean lateral boundary conditions (or mpp link)   
     10   !!---------------------------------------------------------------------- 
     11   !!   zdf_swm      : update Kz due to surface wave-induced mixing  
     12   !!   zdf_swm_init : initilisation 
     13   !!---------------------------------------------------------------------- 
     14   USE dom_oce        ! ocean domain variable 
     15   USE zdf_oce        ! vertical physics: mixing coefficients 
     16   USE sbc_oce        ! Surface boundary condition: ocean fields 
     17   USE sbcwave        ! wave module 
     18   ! 
     19   USE in_out_manager ! I/O manager 
     20   USE lbclnk         ! ocean lateral boundary conditions (or mpp link)   
     21   USE lib_mpp        ! distribued memory computing library 
    1822    
    1923   IMPLICIT NONE 
    2024   PRIVATE 
    2125 
    22    PUBLIC zdf_qiao    ! routine called in step 
     26   PUBLIC zdf_swm         ! routine called in zdp_phy 
     27   PUBLIC zdf_swm_init    ! routine called in zdf_phy_init 
    2328 
    24    REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:,:) :: qbv, qbvu, qbvv 
    25  
    26    !! * Substitutions 
    27 #  include "vectopt_loop_substitute.h90" 
    2829   !!---------------------------------------------------------------------- 
    29    !! NEMO/OPA 4.0 , NEMO Consortium (2011)  
    30    !! $Id: $ 
     30   !! NEMO/OPA 4.0 , NEMO Consortium (2017)  
     31   !! $Id:$ 
    3132   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt) 
    3233   !!---------------------------------------------------------------------- 
    33  
    3434CONTAINS 
    3535 
    36    SUBROUTINE zdf_qiao( kt ) 
     36   SUBROUTINE zdf_swm( kt ) 
    3737      !!--------------------------------------------------------------------- 
    38       !!                     ***  ROUTINE zdf_qiao *** 
     38      !!                     ***  ROUTINE zdf_swm *** 
    3939      !! 
    40       !! ** Purpose :Compute the Qiao term (qbv) to be added to 
     40      !! ** Purpose :Compute the swm term (qbv) to be added to 
    4141      !!             vertical viscosity and diffusivity coeffs.   
    4242      !! 
    43       !! ** Method  :qbv = alpha * A * Us(0) * exp (3 * k * z) 
     43      !! ** Method  :   Compute the swm term Bv (zqb) and added it to 
     44      !!               vertical viscosity and diffusivity coefficients 
     45      !!                   zqb = alpha * A * Us(0) * exp (3 * k * z) 
     46      !!               where alpha is set here to 1 
    4447      !!              
    45       !! ** action  :Compute the Qiao wave dependent term  
    46       !!             only if ln_wave=.true. 
     48      !! ** action  :    avt, avs, avm updated by the surface wave-induced mixing 
     49      !!                               (inner domain only) 
    4750      !!                
     51      !! reference : Qiao et al. GRL, 2004 
    4852      !!--------------------------------------------------------------------- 
    49       INTEGER, INTENT( in  ) ::  kt   ! ocean time step 
     53      INTEGER, INTENT(in) ::   kt   ! ocean time step 
    5054      ! 
    51       INTEGER :: jj, ji, jk   ! dummy loop indices 
     55      INTEGER ::   ji, jj, jk   ! dummy loop indices 
     56      REAL(wp)::   zcoef, zqb   ! local scalar 
    5257      !!--------------------------------------------------------------------- 
    5358      ! 
    54       IF( kt == nit000 ) THEN                   ! First call kt=nit000 ! 
    55          IF( .NOT. ( ln_wave .AND. ln_sdw ) )   & 
    56             &   CALL ctl_stop ( 'Ask for wave Qiao enhanced turbulence but ln_wave   & 
    57             &                    and ln_sdw have to be activated') 
    58          IF( zdf_qiao_alloc() /= 0 )   & 
    59             &   CALL ctl_stop( 'STOP', 'zdf_qiao : unable to allocate arrays' ) 
    60       ENDIF 
    61  
    62       ! 
    63       ! Compute the Qiao term Bv (qbv) to be added to 
    64       ! vertical viscosity and diffusivity 
    65       ! qbv = alpha * A * Us(0) * exp (3 * k * z) 
    66       ! alpha here is set to 1 
    67       !--------------------------------------------------------------------------------- 
    68       ! 
    69 !!gm Comment: I don't understand the use of min of 4 gdepw_n to define a quantity at w-point 
    70 !!gm                       ==>> this is an error.... 
    71       DO jk = 1, jpk 
    72          DO jj = 1, jpjm1 
    73             DO ji = 1, fs_jpim1 
    74                qbv(ji,jj,jk) = 1.0 * 0.353553 * hsw(ji,jj) * tsd2d(ji,jj) *             & 
    75             &                  EXP(3.0 * wnum(ji,jj) *                                  &                      
    76             &                  (-MIN( gdepw_n(ji  ,jj  ,jk), gdepw_n(ji+1,jj  ,jk),     & 
    77             &                         gdepw_n(ji  ,jj+1,jk), gdepw_n(ji+1,jj+1,jk))))   & 
    78             &                          * wmask(ji,jj,jk) 
     59      zcoef = 1._wp * 0.353553_wp 
     60      DO jk = 2, jpkm1 
     61         DO jj = 2, jpjm1 
     62            DO ji = 2, jpim1 
     63               zqb = zcoef * hsw(ji,jj) * tsd2d(ji,jj) * EXP( -3. * wnum(ji,jj) * gdepw_n(ji,jj,jk) ) * wmask(ji,jj,jk) 
     64               ! 
     65               avt(ji,jj,jk) = avt(ji,jj,jk) + zqb 
     66               avs(ji,jj,jk) = avs(ji,jj,jk) + zqb 
     67               avm(ji,jj,jk) = avm(ji,jj,jk) + zqb 
    7968            END DO 
    8069         END DO 
    8170      END DO 
    8271      ! 
    83       CALL lbc_lnk( qbv, 'W', 1. )   ! Lateral boundary conditions 
    84           
     72   END SUBROUTINE zdf_swm 
     73    
     74    
     75   SUBROUTINE zdf_swm_init 
     76      !!--------------------------------------------------------------------- 
     77      !!                     ***  ROUTINE zdf_swm_init *** 
     78      !! 
     79      !! ** Purpose :   surface wave-induced mixing initialisation   
     80      !! 
     81      !! ** Method  :   check the availability of surface wave fields 
     82      !!--------------------------------------------------------------------- 
    8583      ! 
    86       ! Interpolate Qiao parameter qbv into the grid_U and grid_V 
    87       !---------------------------------------------------------- 
     84      IF(lwp) THEN                  ! Control print 
     85         WRITE(numout,*) 
     86         WRITE(numout,*) 'zdf_swm_init : surface wave-driven mixing' 
     87         WRITE(numout,*) '~~~~~~~~~~~~' 
     88      ENDIF 
     89      IF(  .NOT.ln_wave .OR.   & 
     90         & .NOT.ln_sdw    )   CALL ctl_stop ( 'zdf_swm_init: ln_zdfswm=T but ln_wave and ln_sdw /= T') 
    8891      ! 
    89       DO jk = 1, jpk 
    90          DO jj = 1, jpjm1 
    91             DO ji = 1, fs_jpim1 
    92                qbvu(ji,jj,jk) = 0.5 * wumask(ji,jj,jk)  *              &   
    93             &                  ( qbv(ji,jj,jk) + qbv(ji+1,jj  ,jk) ) 
    94                qbvv(ji,jj,jk) = 0.5 * wvmask(ji,jj,jk)  *              & 
    95             &                  ( qbv(ji,jj,jk) + qbv(ji  ,jj+1,jk) ) 
    96             END DO 
    97          END DO 
    98       END DO 
    99       !  
    100       CALL lbc_lnk( qbvu, 'U', 1. ) ; CALL lbc_lnk( qbvv, 'V', 1. )   ! Lateral boundary conditions 
     92   END SUBROUTINE zdf_swm_init 
    10193 
    102       ! Enhance vertical mixing coeff.          
    103       !------------------------------- 
    104       ! 
    105 !!gm  with double diffusion activated, avs is not updated... 
    106 !!gm                    =====>>> BUG 
    107       DO jk = 1, jpkm1 
    108          DO jj = 1, jpj 
    109             DO ji = 1, jpi 
    110                avmu(ji,jj,jk) = ( avmu(ji,jj,jk) + qbvu(ji,jj,jk) ) * umask(ji,jj,jk) 
    111                avmv(ji,jj,jk) = ( avmv(ji,jj,jk) + qbvv(ji,jj,jk) ) * vmask(ji,jj,jk) 
    112                avt (ji,jj,jk) = ( avt (ji,jj,jk) + qbv (ji,jj,jk) ) * tmask(ji,jj,jk) 
    113             END DO 
    114          END DO 
    115       END DO 
    116       ! 
    117    END SUBROUTINE zdf_qiao 
    118  
    119  
    120    INTEGER FUNCTION zdf_qiao_alloc() 
    121       !!---------------------------------------------------------------------- 
    122       !!                ***  FUNCTION zdf_qiao_alloc  *** 
    123       !!---------------------------------------------------------------------- 
    124       ALLOCATE( qbv(jpi,jpj,jpk), qbvu(jpi,jpj,jpk), qbvv(jpi,jpj,jpk),   & 
    125          &      STAT = zdf_qiao_alloc ) 
    126       ! 
    127       IF( lk_mpp             )  CALL mpp_sum ( zdf_qiao_alloc ) 
    128       IF( zdf_qiao_alloc > 0 )  CALL ctl_warn('zdf_qiao_alloc: allocation of arrays failed.') 
    129       ! 
    130    END FUNCTION zdf_qiao_alloc 
    131        
    13294   !!====================================================================== 
    133 END MODULE zdfqiao 
     95END MODULE zdfswm 
Note: See TracChangeset for help on using the changeset viewer.