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 trunk/NEMO/OPA_SRC/ZDF – NEMO

source: trunk/NEMO/OPA_SRC/ZDF/zdfevd.F90 @ 1546

Last change on this file since 1546 was 1546, checked in by ctlod, 15 years ago

small optimisation, see ticket: #495

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
File size: 5.8 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 in_out_manager  ! I/O manager
22   USE iom             ! for iom_put
23   USE lbclnk          ! ocean lateral boundary conditions (or mpp link)
24
25   IMPLICIT NONE
26   PRIVATE
27
28   PUBLIC   zdf_evd    ! called by step.F90
29
30   !! * Substitutions
31#  include "domzgr_substitute.h90"
32   !!----------------------------------------------------------------------
33   !! NEMO/OPA 3.2 , LOCEAN-IPSL (2009)
34   !! $Id$
35   !! Software governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt)
36   !!----------------------------------------------------------------------
37
38CONTAINS
39
40   SUBROUTINE zdf_evd( kt )
41      !!----------------------------------------------------------------------
42      !!                  ***  ROUTINE zdf_evd  ***
43      !!                   
44      !! ** Purpose :   Local increased the vertical eddy viscosity and diffu-
45      !!      sivity coefficients when a static instability is encountered.
46      !!
47      !! ** Method  :   avt, avm, and the 4 neighbouring avmu, avmv coefficients
48      !!      are set to avevd (namelist parameter) if the water column is
49      !!      statically unstable (i.e. if rn2 < -1.e-12 )
50      !!
51      !! ** Action  :   avt, avm, avmu, avmv updted in static instability cases
52      !!
53      !! References :   Lazar, A., these de l'universite Paris VI, France, 1997
54      !!----------------------------------------------------------------------
55      USE oce,   zav_evd  =>   ua   ! use ua as workspace
56      !!
57      INTEGER, INTENT( in ) ::   kt         ! ocean time-step indexocean time step
58      !!
59      INTEGER ::   ji, jj, jk               ! dummy loop indices
60      !!----------------------------------------------------------------------
61
62      IF( kt == nit000 ) THEN
63         IF(lwp) WRITE(numout,*)
64         IF(lwp) WRITE(numout,*) 'zdf_evd : Enhanced Vertical Diffusion (evd)'
65         IF(lwp) WRITE(numout,*) '~~~~~~~ '
66         IF(lwp) WRITE(numout,*)
67      ENDIF
68
69      zav_evd(:,:,:) = avt(:,:,:)           ! set avt prior to evd application
70
71      SELECT CASE ( nn_evdm )
72 
73      CASE ( 1 )           ! enhance vertical eddy viscosity and diffusivity (if rn2<-1.e-12)
74         DO jk = 1, jpkm1 
75#if defined key_vectopt_loop
76            DO jj = 1, 1                     ! big loop forced
77               DO ji = jpi+2, jpij   
78#else
79            DO jj = 2, jpj             ! no vector opt.
80               DO ji = 2, jpi
81#endif
82#if defined key_zdfkpp
83                  ! no evd mixing in the boundary layer with KPP
84                  IF( ( MIN( rn2(ji,jj,jk),  rn2b(ji,jj,jk) ) <= -1.e-12 ) .AND. ( fsdepw(ji,jj,jk) > hkpp(ji,jj) ) ) THEN
85#else
86                  IF(   MIN( rn2(ji,jj,jk),  rn2b(ji,jj,jk) ) <= -1.e-12 ) THEN
87#endif
88                     avt (ji  ,jj  ,jk) = rn_avevd * tmask(ji  ,jj  ,jk)
89                     avm (ji  ,jj  ,jk) = rn_avevd * tmask(ji  ,jj  ,jk)
90                     avmu(ji  ,jj  ,jk) = rn_avevd * umask(ji  ,jj  ,jk)
91                     avmu(ji-1,jj  ,jk) = rn_avevd * umask(ji-1,jj  ,jk)
92                     avmv(ji  ,jj  ,jk) = rn_avevd * vmask(ji  ,jj  ,jk)
93                     avmv(ji  ,jj-1,jk) = rn_avevd * vmask(ji  ,jj-1,jk)
94                  ENDIF
95               END DO
96            END DO
97         END DO
98         CALL lbc_lnk( avt , 'W', 1. )   ;   CALL lbc_lnk( avm , 'W', 1. )   ! Lateral boundary conditions   (unchanged sign)
99         CALL lbc_lnk( avmu, 'U', 1. )   ;   CALL lbc_lnk( avmv, 'V', 1. )
100         !
101      CASE DEFAULT         ! enhance vertical eddy diffusivity only (if rn2<-1.e-12)
102         DO jk = 1, jpkm1
103!!!         WHERE( rn2(:,:,jk) <= -1.e-12 ) avt(:,:,jk) = tmask(:,:,jk) * avevd   ! agissant sur T SEUL!
104#if defined key_vectopt_loop
105            DO jj = 1, 1                     ! big loop forced
106               DO ji = 1, jpij   
107#else
108            DO jj = 1, jpj             ! loop over the whole domain (no lbc_lnk call)
109               DO ji = 1, jpi
110#endif
111#if defined key_zdfkpp
112                  ! no evd mixing in the boundary layer with KPP
113                  IF( ( MIN( rn2(ji,jj,jk), rn2b(ji,jj,jk) ) <= -1.e-12 ) .AND. ( fsdepw(ji,jj,jk) > hkpp(ji,jj) ) ) &         
114#else
115                  IF(   MIN( rn2(ji,jj,jk), rn2b(ji,jj,jk) ) <= -1.e-12 ) &
116#endif
117                     avt(ji,jj,jk) = rn_avevd * tmask(ji,jj,jk)
118               END DO
119            END DO
120         END DO
121         !
122      END SELECT
123
124      zav_evd(:,:,:) = avt(:,:,:) - zav_evd(:,:,:)      ! change in avt due to evd
125      CALL iom_put( "avt_evd", zav_evd )                ! output this change
126      !
127   END SUBROUTINE zdf_evd
128
129   !!======================================================================
130END MODULE zdfevd
Note: See TracBrowser for help on using the repository browser.