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.
zdfevd.F90 in branches/UKMO/dev_r5518_GO6_under_ice_relax_dr_hook/NEMOGCM/NEMO/OPA_SRC/ZDF – NEMO

source: branches/UKMO/dev_r5518_GO6_under_ice_relax_dr_hook/NEMOGCM/NEMO/OPA_SRC/ZDF/zdfevd.F90 @ 11738

Last change on this file since 11738 was 11738, checked in by marc, 4 years ago

The Dr Hook changes from my perl code.

File size: 6.5 KB
Line 
1MODULE zdfevd
2   !!======================================================================
3   !!                       ***  MODULE  zdfevd  ***
4   !! Ocean physics: parameterization of convection through an enhancement
5   !!                of vertical eddy mixing coefficient
6   !!======================================================================
7   !! History :  OPA  !  1997-06  (G. Madec, A. Lazar)  Original code
8   !!   NEMO     1.0  !  2002-06  (G. Madec)  F90: Free form and module
9   !!             -   !  2005-06  (C. Ethe) KPP parameterization
10   !!            3.2  !  2009-03  (M. Leclair, G. Madec, R. Benshila) test on both before & after
11   !!----------------------------------------------------------------------
12
13   !!----------------------------------------------------------------------
14   !!   zdf_evd      : increase the momentum and tracer Kz at the location of
15   !!                  statically unstable portion of the water column (ln_zdfevd=T)
16   !!----------------------------------------------------------------------
17   USE oce             ! ocean dynamics and tracers variables
18   USE dom_oce         ! ocean space and time domain variables
19   USE zdf_oce         ! ocean vertical physics variables
20   USE zdfkpp          ! KPP vertical mixing
21   USE trd_oce         ! trends: ocean variables
22   USE trdtra          ! trends manager: tracers
23   USE in_out_manager  ! I/O manager
24   USE iom             ! for iom_put
25   USE lbclnk          ! ocean lateral boundary conditions (or mpp link)
26   USE timing          ! Timing
27
28   USE yomhook, ONLY: lhook, dr_hook
29   USE parkind1, ONLY: jprb, jpim
30
31   IMPLICIT NONE
32   PRIVATE
33
34   PUBLIC   zdf_evd    ! called by step.F90
35
36   !! * Substitutions
37#  include "domzgr_substitute.h90"
38   !!----------------------------------------------------------------------
39   !! NEMO/OPA 4.0 , NEMO Consortium (2011)
40   !! $Id$
41   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt)
42   !!----------------------------------------------------------------------
43CONTAINS
44
45   SUBROUTINE zdf_evd( kt )
46      !!----------------------------------------------------------------------
47      !!                  ***  ROUTINE zdf_evd  ***
48      !!                   
49      !! ** Purpose :   Local increased the vertical eddy viscosity and diffu-
50      !!      sivity coefficients when a static instability is encountered.
51      !!
52      !! ** Method  :   avt, avm, and the 4 neighbouring avmu, avmv coefficients
53      !!      are set to avevd (namelist parameter) if the water column is
54      !!      statically unstable (i.e. if rn2 < -1.e-12 )
55      !!
56      !! ** Action  :   avt, avm, avmu, avmv updted in static instability cases
57      !!
58      !! References :   Lazar, A., these de l'universite Paris VI, France, 1997
59      !!----------------------------------------------------------------------
60      USE oce,   zavt_evd => ua , zavm_evd => va  ! (ua,va) used ua workspace
61      !
62      INTEGER, INTENT( in ) ::   kt   ! ocean time-step indexocean time step
63      !
64      INTEGER ::   ji, jj, jk   ! dummy loop indices
65      INTEGER(KIND=jpim), PARAMETER :: zhook_in = 0
66      INTEGER(KIND=jpim), PARAMETER :: zhook_out = 1
67      REAL(KIND=jprb)               :: zhook_handle
68
69      CHARACTER(LEN=*), PARAMETER :: RoutineName='ZDF_EVD'
70
71      IF (lhook) CALL dr_hook(RoutineName,zhook_in,zhook_handle)
72
73      !!----------------------------------------------------------------------
74      !
75      IF( nn_timing == 1 )  CALL timing_start('zdf_evd')
76      !
77      IF( kt == nit000 ) THEN
78         IF(lwp) WRITE(numout,*)
79         IF(lwp) WRITE(numout,*) 'zdf_evd : Enhanced Vertical Diffusion (evd)'
80         IF(lwp) WRITE(numout,*) '~~~~~~~ '
81         IF(lwp) WRITE(numout,*)
82      ENDIF
83
84      zavt_evd(:,:,:) = avt(:,:,:)           ! set avt prior to evd application
85
86      SELECT CASE ( nn_evdm )
87      !
88      CASE ( 1 )           ! enhance vertical eddy viscosity and diffusivity (if rn2<-1.e-12)
89         !
90         zavm_evd(:,:,:) = avm(:,:,:)           ! set avm prior to evd application
91         !
92         DO jk = 1, jpkm1 
93            DO jj = 2, jpj             ! no vector opt.
94               DO ji = 2, jpi
95#if defined key_zdfkpp
96                  ! no evd mixing in the boundary layer with KPP
97                  IF(  MIN( rn2(ji,jj,jk), rn2b(ji,jj,jk) ) <= -1.e-12  .AND.  fsdepw(ji,jj,jk) > hkpp(ji,jj)  ) THEN
98#else
99                  IF(  MIN( rn2(ji,jj,jk), rn2b(ji,jj,jk) ) <= -1.e-12 ) THEN
100#endif
101                     avt (ji  ,jj  ,jk) = rn_avevd * tmask(ji  ,jj  ,jk)
102                     avm (ji  ,jj  ,jk) = rn_avevd * tmask(ji  ,jj  ,jk)
103                     avmu(ji  ,jj  ,jk) = rn_avevd * umask(ji  ,jj  ,jk)
104                     avmu(ji-1,jj  ,jk) = rn_avevd * umask(ji-1,jj  ,jk)
105                     avmv(ji  ,jj  ,jk) = rn_avevd * vmask(ji  ,jj  ,jk)
106                     avmv(ji  ,jj-1,jk) = rn_avevd * vmask(ji  ,jj-1,jk)
107                  ENDIF
108               END DO
109            END DO
110         END DO
111         CALL lbc_lnk( avt , 'W', 1. )   ;   CALL lbc_lnk( avm , 'W', 1. )   ! Lateral boundary conditions
112         CALL lbc_lnk( avmu, 'U', 1. )   ;   CALL lbc_lnk( avmv, 'V', 1. )
113         !
114         zavm_evd(:,:,:) = avm(:,:,:) - zavm_evd(:,:,:)   ! change in avm due to evd
115         CALL iom_put( "avm_evd", zavm_evd )              ! output this change
116         !
117      CASE DEFAULT         ! enhance vertical eddy diffusivity only (if rn2<-1.e-12)
118         DO jk = 1, jpkm1
119!!!         WHERE( rn2(:,:,jk) <= -1.e-12 ) avt(:,:,jk) = tmask(:,:,jk) * avevd   ! agissant sur T SEUL!
120            DO jj = 1, jpj             ! loop over the whole domain (no lbc_lnk call)
121               DO ji = 1, jpi
122#if defined key_zdfkpp
123                  ! no evd mixing in the boundary layer with KPP
124                  IF(  MIN( rn2(ji,jj,jk), rn2b(ji,jj,jk) ) <= -1.e-12  .AND.  fsdepw(ji,jj,jk) > hkpp(ji,jj)  )   &         
125#else
126                  IF(  MIN( rn2(ji,jj,jk), rn2b(ji,jj,jk) ) <= -1.e-12 )   &
127#endif
128                     avt(ji,jj,jk) = rn_avevd * tmask(ji,jj,jk)
129               END DO
130            END DO
131         END DO
132         !
133      END SELECT
134
135      zavt_evd(:,:,:) = avt(:,:,:) - zavt_evd(:,:,:)   ! change in avt due to evd
136      CALL iom_put( "avt_evd", zavt_evd )              ! output this change
137      IF( l_trdtra ) CALL trd_tra( kt, 'TRA', jp_tem, jptra_evd, zavt_evd )
138      !
139      IF( nn_timing == 1 )  CALL timing_stop('zdf_evd')
140      !
141      IF (lhook) CALL dr_hook(RoutineName,zhook_out,zhook_handle)
142   END SUBROUTINE zdf_evd
143
144   !!======================================================================
145END MODULE zdfevd
Note: See TracBrowser for help on using the repository browser.