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

Ignore:
Timestamp:
2017-04-23T09:30:41+02:00 (7 years ago)
Author:
gm
Message:

#1880 (HPC-09): add zdfphy (the ZDF manager) + remove all key_...

File:
1 moved

Legend:

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

    r7931 r7953  
    1 MODULE zdfini 
     1MODULE zdfphy 
    22   !!====================================================================== 
    3    !!                      ***  MODULE  zdfini  *** 
    4    !! Ocean physics :   read vertical mixing namelist and check consistancy 
     3   !!                      ***  MODULE  zdfphy  *** 
     4   !! Ocean physics :   manager of vertical mixing parametrizations 
    55   !!====================================================================== 
    6    !! History :  8.0  ! 1997-06  (G. Madec)  Original code from inimix 
    7    !!            1.0  ! 2002-08  (G. Madec)  F90 : free form 
    8    !!             -   ! 2005-06  (C. Ethe) KPP scheme 
    9    !!             -   ! 2009-07  (G. Madec) add avmb, avtb in restart for cen2 advection 
    10    !!            3.7  ! 2014-12  (G. Madec) remove KPP scheme 
    11    !!---------------------------------------------------------------------- 
    12  
    13    !!---------------------------------------------------------------------- 
    14    !!   zdf_init    : initialization, namelist read, and parameters control 
    15    !!---------------------------------------------------------------------- 
    16    USE par_oce         ! mesh and scale factors 
    17    USE zdf_oce         ! TKE vertical mixing           
    18    USE sbc_oce         ! surface module (only for nn_isf in the option compatibility test) 
    19    USE zdftke          ! TKE vertical mixing 
    20    USE zdfgls          ! GLS vertical mixing 
    21    USE zdfric          ! Richardson vertical mixing    
    22    USE zdfddm          ! double diffusion mixing       
    23    USE zdfevd          ! enhanced vertical diffusion   
    24    USE tranpc          ! convection: non penetrative adjustment 
    25    USE ldfslp          ! iso-neutral slopes 
     6   !! History :  4.0  !  2017-04  (G. Madec)  original code 
     7   !!---------------------------------------------------------------------- 
     8 
     9   !!---------------------------------------------------------------------- 
     10   !!   zdf_phy_init  : initialization of all vertical physics pakages 
     11   !!   zdf_phy       : upadate at each time-step the vertical mixing coeff.  
     12   !!---------------------------------------------------------------------- 
     13   USE par_oce        ! mesh and scale factors 
     14   USE zdf_oce        ! TKE vertical mixing           
     15   USE sbc_oce        ! surface module (only for nn_isf in the option compatibility test) 
     16   USE zdfbfr         ! bottom friction 
     17   USE zdftke         ! TKE vertical mixing 
     18   USE zdfgls         ! GLS vertical mixing 
     19   USE zdfric         ! Richardson vertical mixing    
     20   USE zdfddm         ! double diffusion mixing       
     21   USE zdfevd         ! enhanced vertical diffusion 
     22   USE zdftmx         ! internal tide-induced mixing 
     23   USE zdfqiao          !Qiao module wave induced mixing   (zdf_qiao routine) 
     24   USE zdfmxl           ! Mixed-layer depth                (zdf_mxl routine) 
     25   USE tranpc         ! convection: non penetrative adjustment 
     26   USE sbcrnf         ! surface boundary condition: runoff variables 
    2627   ! 
    27    USE in_out_manager  ! I/O manager 
    28    USE iom             ! IOM library 
    29    USE lib_mpp         ! distribued memory computing 
     28   USE in_out_manager ! I/O manager 
     29   USE iom            ! IOM library 
     30   USE lib_mpp        ! distribued memory computing 
    3031 
    3132   IMPLICIT NONE 
    3233   PRIVATE 
    3334 
    34    PUBLIC   zdf_init   ! routine called by opa.F90 
     35   PUBLIC   zdf_phy_init   ! routine called by nemogcm.F90 
     36   PUBLIC   zdf_phy        ! routine called by step.F90 
     37    
    3538    
    3639   !!---------------------------------------------------------------------- 
     
    4144CONTAINS 
    4245 
    43    SUBROUTINE zdf_init 
    44       !!---------------------------------------------------------------------- 
    45       !!                  ***  ROUTINE zdf_init  *** 
     46   SUBROUTINE zdf_phy_init 
     47      !!---------------------------------------------------------------------- 
     48      !!                  ***  ROUTINE zdf_phy_init  *** 
    4649      !!  
    4750      !! ** Purpose :   initializations of the vertical ocean physics 
     
    4952      !! ** Method  :   Read namelist namzdf, control logicals  
    5053      !!---------------------------------------------------------------------- 
    51       INTEGER ::   ioptio, ios       ! local integers 
     54      INTEGER ::   ioptio, ios   ! local integers 
    5255      !! 
    5356      NAMELIST/namzdf/ ln_zdfcst, ln_zdfric, ln_zdftke, ln_zdfgls,   &     ! type of closure scheme 
     
    7780      IF(lwp) THEN               !* Parameter print 
    7881         WRITE(numout,*) 
    79          WRITE(numout,*) 'zdf_init : vertical physics' 
     82         WRITE(numout,*) 'zdf_phy_init : vertical physics' 
    8083         WRITE(numout,*) '~~~~~~~~' 
    8184         WRITE(numout,*) '   Namelist namzdf : set vertical mixing mixing parameters' 
     
    106109      ENDIF 
    107110 
    108       IF(ln_zdfddm) THEN                    ! double diffusive mixing' 
    109          ALLOCATE( avs(jpi,jpj,jpk) ) 
    110          avs(:,:,:) = rn_avt0 * wmask(:,:,:)  
    111       ENDIF 
    112  
     111!!gm      IF(ln_zdfddm) THEN                    ! double diffusive mixing' 
     112!         avs(:,:,:) = rn_avt0 * wmask(:,:,:)  
     113!!gm      ENDIF 
    113114 
    114115      !                          !* Parameter & logical controls 
     
    122123      IF(lwp) WRITE(numout,*) '   vertical mixing option :' 
    123124      ioptio = 0 
    124       IF( lk_zdfcst ) THEN 
     125      IF( ln_zdfcst ) THEN 
    125126         IF(lwp) WRITE(numout,*) '      constant eddy diffusion coefficients' 
    126127         ioptio = ioptio+1 
    127128      ENDIF 
    128       IF( lk_zdfric ) THEN 
     129      IF( ln_zdfric ) THEN 
    129130         IF(lwp) WRITE(numout,*) '      Richardson dependent eddy coefficients' 
    130131         ioptio = ioptio+1 
    131132      ENDIF 
    132       IF( lk_zdftke ) THEN 
     133      IF( ln_zdftke ) THEN 
    133134         IF(lwp) WRITE(numout,*) '      TKE dependent eddy coefficients' 
    134135         ioptio = ioptio+1 
    135136      ENDIF 
    136       IF( lk_zdfgls ) THEN 
     137      IF( ln_zdfgls ) THEN 
    137138         IF(lwp) WRITE(numout,*) '      GLS dependent eddy coefficients' 
    138139         ioptio = ioptio+1 
     
    140141      IF( ioptio == 0 .OR. ioptio > 1 )   & 
    141142         &   CALL ctl_stop( ' one and only one vertical diffusion option has to be defined ' ) 
    142       IF( ( lk_zdfric .OR. lk_zdfgls ) .AND. ln_isfcav )   & 
     143      IF( ( ln_zdfric .OR. ln_zdfgls ) .AND. ln_isfcav )   & 
    143144         &   CALL ctl_stop( ' only zdfcst and zdftke were tested with ice shelves cavities ' ) 
    144145      ! 
     
    148149      ! 
    149150#if defined key_top 
    150       IF( ln_zdfnpc )   CALL ctl_stop( ' zdf_init: npc scheme is not working with key_top' ) 
     151      IF( ln_zdfnpc )   CALL ctl_stop( ' zdf_phy_init: npc scheme is not working with key_top' ) 
    151152#endif 
    152153      ! 
     
    160161         ioptio = ioptio+1 
    161162      ENDIF 
    162       IF( lk_zdftke ) THEN 
     163      IF( ln_zdftke ) THEN 
    163164         IF(lwp) WRITE(numout,*) '      use the 1.5 turbulent closure' 
    164165      ENDIF 
    165       IF( lk_zdfgls ) THEN 
     166      IF( ln_zdfgls ) THEN 
    166167         IF(lwp) WRITE(numout,*) '      use the GLS closure scheme' 
    167168      ENDIF 
    168169      IF ( ioptio > 1 )   CALL ctl_stop( ' chose between ln_zdfnpc and ln_zdfevd' ) 
    169       IF( ioptio == 0 .AND. .NOT.( lk_zdftke .OR. lk_zdfgls ) )           & 
     170      IF( ioptio == 0 .AND. .NOT.( ln_zdftke .OR. ln_zdfgls ) )           & 
    170171         CALL ctl_stop( ' except for TKE or GLS physics, a convection scheme is',   & 
    171172         &              ' required: ln_zdfevd or ln_zdfnpc logicals' ) 
     
    202203      ENDIF 
    203204      ! 
    204    END SUBROUTINE zdf_init 
     205 
     206!!gm moved into zdf_phy_init 
     207! 
     208                            CALL zdf_bfr_init      ! bottom friction 
     209 
     210      ioptio = 0                 !==  type of vertical turbulent closure  ==!    (set nzdfphy) 
     211      ! 
     212!      IF( ln_zdfcst ) THEN   ;   ioptio = ioptio + 1   ;    nzdf_phy = np_CST   ;   ENDIF 
     213!      IF( ln_zdfric ) THEN   ;   ioptio = ioptio + 1   ;    nzdf_phy = np_RIC   ;   CALL zdf_ric_init   ;   ENDIF 
     214!      IF( ln_zdftke ) THEN   ;   ioptio = ioptio + 1   ;    nzdf_phy = np_TKE   ;   CALL zdf_tke_init   ;   ENDIF 
     215!      IF( ln_zdfgls ) THEN   ;   ioptio = ioptio + 1   ;    nzdf_phy = np_GLS   ;   CALL zdf_gls_init   ;   ENDIF 
     216 
     217 
     218      ! 
     219      IF( ln_zdfric     )   CALL zdf_ric_init      ! Richardson number dependent Kz 
     220      IF( ln_zdftke     )   CALL zdf_tke_init      ! TKE closure scheme 
     221      IF( ln_zdfgls     )   CALL zdf_gls_init      ! GLS closure scheme 
     222      IF( ln_zdftmx     )   CALL zdf_tmx_init      ! tidal vertical mixing 
     223!!gm 
     224      ! 
     225   END SUBROUTINE zdf_phy_init 
     226 
     227 
     228   SUBROUTINE zdf_phy( kstp ) 
     229      !!---------------------------------------------------------------------- 
     230      !!                     ***  ROUTINE zdf_phy  *** 
     231      !! 
     232      !! ** Purpose :  Update ocean physics at each time-step 
     233      !! 
     234      !! ** Method  :  
     235      !! 
     236      !! ** Action  :   avm, avt vertical eddy viscosity and diffusivity at w-points 
     237      !!                nmld ??? mixed layer depth in level and meters   <<<<====verifier ! 
     238      !!                bottom stress.....                               <<<<====verifier ! 
     239      !!---------------------------------------------------------------------- 
     240      INTEGER, INTENT(in) ::   kstp   ! ocean time-step index 
     241      ! 
     242      INTEGER ::   ji, jj, jk    ! dummy loop indice 
     243      !!---------------------------------------------------------------------- 
     244      ! 
     245                         CALL zdf_bfr( kstp )         ! bottom friction (if quadratic) 
     246      !                                               ! Vertical eddy viscosity and diffusivity coefficients 
     247      IF( ln_zdfric  )   CALL zdf_ric ( kstp )             ! Richardson number dependent Kz 
     248      IF( ln_zdftke  )   CALL zdf_tke ( kstp )             ! TKE closure scheme for Kz 
     249      IF( ln_zdfgls  )   CALL zdf_gls ( kstp )             ! GLS closure scheme for Kz 
     250      IF( ln_zdfqiao )   CALL zdf_qiao( kstp )             ! Qiao vertical mixing  
     251      ! 
     252      IF( ln_zdfcst  ) THEN                                ! Constant Kz (reset avt, avm[uv] to the background value) 
     253         avt (:,:,:) = rn_avt0 * wmask (:,:,:) 
     254         avm (:,:,:) = rn_avm0 * wmask (:,:,:) 
     255         avmu(:,:,:) = rn_avm0 * wumask(:,:,:) 
     256         avmv(:,:,:) = rn_avm0 * wvmask(:,:,:) 
     257      ENDIF 
     258      ! 
     259      IF( ln_rnf_mouth ) THEN                         ! increase diffusivity at rivers mouths 
     260         DO jk = 2, nkrnf   ;   avt(:,:,jk) = avt(:,:,jk) + 2._wp * rn_avt_rnf * rnfmsk(:,:) * tmask(:,:,jk)   ;   END DO 
     261      ENDIF 
     262      ! 
     263      IF( ln_zdfevd  )   CALL zdf_evd( kstp )         ! enhanced vertical eddy diffusivity 
     264      ! 
     265      IF( ln_zdfddm  ) THEN                           ! double diffusive mixing 
     266                         CALL zdf_ddm( kstp ) 
     267      ELSE                                            ! avs=avt 
     268         DO jk = 2, jpkm1   ;   avs(:,:,jk) = avt(:,:,jk)   ;   END DO 
     269      ENDIF 
     270      ! 
     271      IF( ln_zdftmx  )   CALL zdf_tmx( kstp )         ! tidal vertical mixing 
     272 
     273                         CALL zdf_mxl( kstp )         ! mixed layer depth 
     274 
     275                                                      ! write TKE or GLS information in the restart file 
     276      IF( lrst_oce .AND. ln_zdftke )   CALL tke_rst( kstp, 'WRITE' ) 
     277      IF( lrst_oce .AND. ln_zdfgls )   CALL gls_rst( kstp, 'WRITE' ) 
     278      ! 
     279   END SUBROUTINE zdf_phy 
    205280 
    206281   !!====================================================================== 
    207 END MODULE zdfini 
     282END MODULE zdfphy 
Note: See TracChangeset for help on using the changeset viewer.